C # .NET: if ((e.State & ListViewItemStates.Selected)! = 0) <- Что это значит? - PullRequest
4 голосов
/ 19 мая 2010

В стандартном коде MSN в ListView есть строка - Ownerdraw - DrawItem:

if ((e.State & ListViewItemStates.Selected) != 0)
{
    //Draw the selected background
}

Видимо это делает побитовое сравнение для состояния ?? Почему поразрядно? Следующее не работает:

if (e.State == ListViewItemStates.Selected)
{
    //Doesn't work ??
}

Почему это сравнение не работает? Это просто стандартный Enum ?? Я немного в постели ..

Ответы [ 5 ]

9 голосов
/ 19 мая 2010

Это не стандартный Enum - он украшен FlagsAttribute, что делает его битовой маской. Подробнее см. MSDN FlagsAttribute .

Первый пример проверяет, установлен ли какой-либо из флагов, как вы правильно интерпретировали. Флаги обычно объединяются с помощью | оператор (хотя + и ^ также безопасны для правильно указанного атрибута без наложений).

4 голосов
/ 19 августа 2012

Вы также можете использовать это:

if (e.State.HasFlag(ListViewItemStates.Selected))

чтобы проверить, выбран ли элемент.

4 голосов
/ 19 мая 2010
1 голос
/ 19 мая 2010

ListViewItemStates - это перечисление «Flag»: переменная ListViewItemStates может быть комбинацией значений. Пример: фокусируется и проверяется

Если вы используете равенство, подобное e.State == ListViewItemStates.Selected, чтобы определить, выбран ли элемент, вы сможете обнаружить случай, когда значение только "Выбрано", но вы пропустите случай, когда значение является композицией состояния.

Битовая операция позволяет вам независимо проверять значение.

Надеюсь, это поможет

1 голос
/ 19 мая 2010

Значением состояния является флаг enum - это означает, что разные биты в нем означают разные вещи, и они могут быть объединены, чтобы рассказать вам несколько вещей о состоянии. Например

[Flags]
public enum States
{
    Selected = 1;
    OnScreen = 2;
    Purple = 4;
} 

Поэтому, если вы хотите увидеть, выбрано ли что-то, вы не можете просто сравнить его с выбранным (посмотрите, имеет ли оно значение int, равное 1), потому что оно может быть как выделенным, так и на экране (и оно будет иметь значение int 3). Выполняя побитовое сравнение, вы проверяете, установлен ли флаг Selected , игнорируя значение других флагов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...