在标准的MSN代码中,ListView上有一行 - Ownerdraw - DrawItem:
if ((e.State & ListViewItemStates.Selected) != 0)
{
//Draw the selected background
}
显然它对状态进行了逐位比较?为什么按位? 以下不起作用:
if (e.State == ListViewItemStates.Selected)
{
//Doesn't work ??
}
为什么这种比较不起作用?它只是一个标准的枚举?我有点被挡住了..
答案 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的情况国家组成。
按位操作允许您独立测试值。
希望有所帮助