C#.NET:if((e.State& ListViewItemStates.Selected)!= 0)< - 这是什么意思?

时间:2010-05-19 14:33:11

标签: c# .net listview bit-manipulation

在标准的MSN代码中,ListView上有一行 - Ownerdraw - DrawItem:

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

显然它对状态进行了逐位比较?为什么按位? 以下不起作用:

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

为什么这种比较不起作用?它只是一个标准的枚举?我有点被挡住了..

5 个答案:

答案 0 :(得分:9)

它不是标准的枚举 - 它用FlagsAttribute装饰,使其成为位掩码。有关详细信息,请参阅MSDN FlagsAttribute

第一个示例检查是否设置了任何标志,正如您正确解释的那样。标志通常使用|组合运算符(虽然+和^对于没有重叠的正确指定的属性也是安全的。)

答案 1 :(得分:4)

答案 2 :(得分:4)

您也可以使用:

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

检查项目是否被选中。

答案 3 :(得分:1)

state的值是一个标志枚举 - 这意味着它中的不同位意味着不同的东西,它们可以结合起来告诉你关于状态的多个事情。例如

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

因此,如果你想看看是否选择了某些东西,你不能只将它与选中的东西进行比较(看它的int值是否为1),因为它既可以选择也可以在屏幕上(并且它的int值为3)。通过进行逐位比较,您将检查是否设置了Selected 标志而忽略了其他标志的值。

答案 4 :(得分:1)

ListViewItemStates是一个“Flag”枚举:ListViewItemStates的变量可以是值的组合。例如:聚焦和检查

如果使用像e.State == ListViewItemStates.Selected之类的相等来确定是否选择了某个项目,那么您将能够检测到该值仅为“已选定”的情况,但您将错过值为a的情况国家组成。

按位操作允许您独立测试值。

希望有所帮助