C#基础系列(4)-- 第一部分 基础数据类型与操作 -- 枚举类型与位标志(4)

经常有人问下面的问题,就是在GridView的RowDataBound事件中,判断是否是EditItemTemplate里的控件为什么是
if ((e.Row.RowState & DataControlRowState.Edit) != 0)
而不是
if (e.Row.RowState == DataControlRowState.Edit)
具体代码如下:

  1. protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
  2. {
  3.     if (e.Row.RowType == DataControlRowType.DataRow)
  4.     {
  5.         //这里对ItemTemplate里的控件进行操作  
  6.         if ((e.Row.RowState & DataControlRowState.Edit) != 0)
  7.         {
  8.             //这里对EditItemTemplate里的控件进行操作
  9.         }
  10.     }
  11. }

关于这个问题,我们首先需要了解在枚举类型中加[Flags]特性(C#编译器允许使用Flags或System.FlagsAttribute自定义特性)可以用来表示一组可组合的位标记,这时这些位标记并不是互斥的,而是有可能同时存在的,这时此枚举的ToString()方法会返回一个包括所有常量名的字符串,各常量名之间用逗号分隔。
比如

  1. [Flags]
  2. public enum MouseButtons
  3. {
  4.     //     未曾按下鼠标按钮。
  5.     None = 0,
  6.     //     鼠标左按钮曾按下。
  7.     Left = 1,
  8.     //     鼠标右按钮曾按下。
  9.     Right = 2,
  10.     //     鼠标中按钮曾按下。
  11.     Middle = 4,
  12. }

当我们有MouseButtons m = MouseButtons.Left | MouseButtons.Right;它表达的可能是用户同时按下了鼠标的左键和右键。

此时Console.WriteLine(m)的输出为Left, Right。

现在我们想判断一下m这个操作中是否有鼠标左键按下,也就是说我们要确定m中是否包含一个已设置的单独位标志(MouseButtons.Left),那我们可以用以下条件语句
if((m & MouseButtons.Left) == MouseButtons.Left)

在上面的案例中,m其实就是011(001 | 010的结果), MouseButtons.Left其实就是001
那么
   011
&001
====
   001

这里请注意MouseButtons中的所有枚举值都是2的n次方,其二进制表示形式中只可能出现一个1(对于MouseButtons.Left就是最后一位为1),MouseButtons.Left的其他位置和m的其他位置进行位与运算(&)的结果必然为0,而m中与MouseButtons.Left包含1的那一位同一位置的数值决定了位与的结果。如果m的这一位置是1,那么位与的结果就是001,这也就意味着m这个枚举变量表示用户按下了鼠标左键。


所以
要确定一个枚举变量是否包含一个已设置的位标记,可以使用以下条件语句
if((m & MouseButtons.Left) == MouseButtons.Left)

要确定一个枚举变量是否只包含一个已设置的位标记,可以使用以下条件语句
if(m == MouseButtons.Left)

要确定一个枚举变量是否包含一组已设置的位标记,可以使用以下条件语句
if((m & (MouseButtons.Left | MouseButtons.Right)) == (MouseButtons.Left | MouseButtons.Right))

要确定一个枚举变量是否只包含一组已设置的位标记,可以使用以下条件语句
if((m | (MouseButtons.Left | MouseButtons.Right)) == (MouseButtons.Left | MouseButtons.Right))


了解了以上的内容,再看看DataControlRowState枚举类型的定义

  1. namespace System.Web.UI.WebControls
  2. {
  3.     // 摘要:
  4.     //     指定数据控件(例如 System.Web.UI.WebControls.DetailsView 或 System.Web.UI.WebControls.GridView)中行的状态。
  5.     [Flags]
  6.     public enum DataControlRowState
  7.     {
  8.         // 摘要:
  9.         //     指示该数据控件行处于正常状态。System.Web.UI.WebControls.DataControlRowState.Normal 状态与其他所有状态互相排斥。
  10.         Normal = 0,
  11.         //
  12.         // 摘要:
  13.         //     指示该数据控件行是交替行。
  14.         Alternate = 1,
  15.         //
  16.         // 摘要:
  17.         //     指示该行已被用户选定。
  18.         Selected = 2,
  19.         //
  20.         // 摘要:
  21.         //     指示该行处于编辑状态,这通常是单击行的“编辑”按钮的结果。通常,System.Web.UI.WebControls.DataControlRowState.Edit
  22.         //     和 System.Web.UI.WebControls.DataControlRowState.Insert 状态互相排斥。
  23.         Edit = 4,
  24.         //
  25.         // 摘要:
  26.         //     指示该行是新行,这通常是单击“插入”按钮添加新行的结果。通常,System.Web.UI.WebControls.DataControlRowState.Insert
  27.         //     和 System.Web.UI.WebControls.DataControlRowState.Edit 状态互相排斥。
  28.         Insert = 8,
  29.     }
  30. }

回到我们开始的问题,能明白为什么要那样写了么?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值