经常有人问下面的问题,就是在GridView的RowDataBound事件中,判断是否是EditItemTemplate里的控件为什么是
if ((e.Row.RowState & DataControlRowState.Edit) != 0)
而不是
if (e.Row.RowState == DataControlRowState.Edit)
具体代码如下:
- protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
- {
- if (e.Row.RowType == DataControlRowType.DataRow)
- {
- //这里对ItemTemplate里的控件进行操作
- if ((e.Row.RowState & DataControlRowState.Edit) != 0)
- {
- //这里对EditItemTemplate里的控件进行操作
- }
- }
- }
关于这个问题,我们首先需要了解在枚举类型中加[Flags]特性(C#编译器允许使用Flags或System.FlagsAttribute自定义特性)可以用来表示一组可组合的位标记,这时这些位标记并不是互斥的,而是有可能同时存在的,这时此枚举的ToString()方法会返回一个包括所有常量名的字符串,各常量名之间用逗号分隔。
比如
- [Flags]
- public enum MouseButtons
- {
- // 未曾按下鼠标按钮。
- None = 0,
- // 鼠标左按钮曾按下。
- Left = 1,
- // 鼠标右按钮曾按下。
- Right = 2,
- // 鼠标中按钮曾按下。
- Middle = 4,
- }
当我们有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枚举类型的定义
- namespace System.Web.UI.WebControls
- {
- // 摘要:
- // 指定数据控件(例如 System.Web.UI.WebControls.DetailsView 或 System.Web.UI.WebControls.GridView)中行的状态。
- [Flags]
- public enum DataControlRowState
- {
- // 摘要:
- // 指示该数据控件行处于正常状态。System.Web.UI.WebControls.DataControlRowState.Normal 状态与其他所有状态互相排斥。
- Normal = 0,
- //
- // 摘要:
- // 指示该数据控件行是交替行。
- Alternate = 1,
- //
- // 摘要:
- // 指示该行已被用户选定。
- Selected = 2,
- //
- // 摘要:
- // 指示该行处于编辑状态,这通常是单击行的“编辑”按钮的结果。通常,System.Web.UI.WebControls.DataControlRowState.Edit
- // 和 System.Web.UI.WebControls.DataControlRowState.Insert 状态互相排斥。
- Edit = 4,
- //
- // 摘要:
- // 指示该行是新行,这通常是单击“插入”按钮添加新行的结果。通常,System.Web.UI.WebControls.DataControlRowState.Insert
- // 和 System.Web.UI.WebControls.DataControlRowState.Edit 状态互相排斥。
- Insert = 8,
- }
- }
回到我们开始的问题,能明白为什么要那样写了么?