http://www.cnblogs.com/jhxk/articles/1666818.html
代码
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
//如果使用if (e.Row.RowState == DataControlRowState.Edit)作为判断条件,那么如果当前行恰好是交替行时,条件不成立-即便当前行确实也处于编辑状态*/
if ((e.Row.RowState & DataControlRowState.Edit) != 0)
{
TextBox txt1 = e.Row.Cells[1].Controls[0] as TextBox;
txt1.Width = 200;
txt1.Height=200;
}
}
其他方式:
e.Row.RowState.ToString().IndexOf("Edit") != -1
或:
e.Row.RowState == (DataControlRowState.Alternate|DataControlRowState.Edit) || e.Row.RowState ==DataControlRowState.Edit
解释:
在GridView控件开启了编辑功能后,点“编辑”链接一般来说都会改变该行为Edit状态,比如在RowDataBound这类事件中用
if(e.Row.RowState == DataControlRowState.Edit)
{
string a="test";
}
来判断是否当前行处于Edit状态,其实这样照理说没任何问题,但是会遇到一个问题,在单数行执行上面的代码块没问题(比如1,3,5,7..行),但是双数行就不会执行(比如2,4,6..行),仔细调试跟踪+MSDN发现双数行的RowState不仅仅有"edit"状态还有"Alternate"状态,MSDN中Alternate的说明是"指示该数据控件行是交替行",难怪不得上面判断代码不执行,把他们都转换成int跟踪看看
双数行如2,4,6..行的e.Row.RowState 返回的枚举是: Alternate|Edit 转换成int为5
下面是调试代码得出的结果:
int i = (int)(e.Row.RowState);//5
int j = (int)(DataControlRowState.Edit);//4
以上跟踪调试发现在交替行+编辑行的时候i值是5而j是4 所以上面IF语句条件判断不正确当然不会执行了,在单行时候i和j的值都为4,上面IF条件判断4==4所以执行没问题。
这里介绍一种方法不管是单行还是交替行都认为是EDIT状态:
if ((e.Row.RowState & DataControlRowState.Edit) != 0)
因为不管4&4还是5&4都不等于0,所以上面IF执行成功,如果要判断非edit状态,比如说刚进入Gridview的时候我们可以通过
if ((e.Row.RowState & DataControlRowState.Edit) == 0)
来判断,这个时候RowState的值是Normal也就是0,自然0&4==0 上面if执行成功。
逻辑运算解释:
1.整数逻辑运算符
预定义的整数逻辑运算符为(以下为.net的运算符重载):
代码
int operator &(int x, int y);
uint operator &(uint x, uint y);
long operator &(long x, long y);
ulong operator &(ulong x, ulong y);
int operator |(int x, int y);
uint operator |(uint x, uint y);
long operator |(long x, long y);
ulong operator |(ulong x, ulong y);
int operator ^(int x, int y);
uint operator ^(uint x, uint y);
long operator ^(long x, long y);
ulong operator ^(ulong x, ulong y);
& 运算符计算两个操作数的按位逻辑 AND,| 运算符计算两个操作数的按位逻辑 OR,而 ^ 运算符计算两个操作数的按位逻辑 XOR。这些运算不可能产生溢出。
2.枚举逻辑运算符
每个枚举类型 E 都隐式地提供下列预定义的逻辑运算符:
E operator &(E x, E y);
E operator |(E x, E y);
E operator ^(E x, E y);
x op y(其中 x 和 y 是具有基础类型 U 的枚举类型 E 的表达式,op 是一个逻辑运算符)的计算结果与 (E)((U)x op (U)y) 的计算结果完全相同。换言之,枚举类型逻辑运算符直接对两个操作数的基础类型执行逻辑运算(也就是枚举类型所返回的整数来计算)。
布尔逻辑运算符
预定义的布尔逻辑运算符为:
bool operator &(bool x, bool y);
bool operator |(bool x, bool y);
bool operator ^(bool x, bool y);
如果 x 和 y 均为 true,则 x & y 的结果为 true。否则,结果为 false。
如果 x 或 y 为 true,则 x | y 的结果为 true。否则,结果为 false。
如果 x 为 true 而 y 为 false,或者 x 为 false 而 y 为 true,则 x ^ y 的结果为 true。否则,结果为 false。当操作数为 bool 类型时,^ 运算符计算结果与 != 运算符相同。
代码
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
//如果使用if (e.Row.RowState == DataControlRowState.Edit)作为判断条件,那么如果当前行恰好是交替行时,条件不成立-即便当前行确实也处于编辑状态*/
if ((e.Row.RowState & DataControlRowState.Edit) != 0)
{
TextBox txt1 = e.Row.Cells[1].Controls[0] as TextBox;
txt1.Width = 200;
txt1.Height=200;
}
}
其他方式:
e.Row.RowState.ToString().IndexOf("Edit") != -1
或:
e.Row.RowState == (DataControlRowState.Alternate|DataControlRowState.Edit) || e.Row.RowState ==DataControlRowState.Edit
解释:
在GridView控件开启了编辑功能后,点“编辑”链接一般来说都会改变该行为Edit状态,比如在RowDataBound这类事件中用
if(e.Row.RowState == DataControlRowState.Edit)
{
string a="test";
}
来判断是否当前行处于Edit状态,其实这样照理说没任何问题,但是会遇到一个问题,在单数行执行上面的代码块没问题(比如1,3,5,7..行),但是双数行就不会执行(比如2,4,6..行),仔细调试跟踪+MSDN发现双数行的RowState不仅仅有"edit"状态还有"Alternate"状态,MSDN中Alternate的说明是"指示该数据控件行是交替行",难怪不得上面判断代码不执行,把他们都转换成int跟踪看看
双数行如2,4,6..行的e.Row.RowState 返回的枚举是: Alternate|Edit 转换成int为5
下面是调试代码得出的结果:
int i = (int)(e.Row.RowState);//5
int j = (int)(DataControlRowState.Edit);//4
以上跟踪调试发现在交替行+编辑行的时候i值是5而j是4 所以上面IF语句条件判断不正确当然不会执行了,在单行时候i和j的值都为4,上面IF条件判断4==4所以执行没问题。
这里介绍一种方法不管是单行还是交替行都认为是EDIT状态:
if ((e.Row.RowState & DataControlRowState.Edit) != 0)
因为不管4&4还是5&4都不等于0,所以上面IF执行成功,如果要判断非edit状态,比如说刚进入Gridview的时候我们可以通过
if ((e.Row.RowState & DataControlRowState.Edit) == 0)
来判断,这个时候RowState的值是Normal也就是0,自然0&4==0 上面if执行成功。
逻辑运算解释:
1.整数逻辑运算符
预定义的整数逻辑运算符为(以下为.net的运算符重载):
代码
int operator &(int x, int y);
uint operator &(uint x, uint y);
long operator &(long x, long y);
ulong operator &(ulong x, ulong y);
int operator |(int x, int y);
uint operator |(uint x, uint y);
long operator |(long x, long y);
ulong operator |(ulong x, ulong y);
int operator ^(int x, int y);
uint operator ^(uint x, uint y);
long operator ^(long x, long y);
ulong operator ^(ulong x, ulong y);
& 运算符计算两个操作数的按位逻辑 AND,| 运算符计算两个操作数的按位逻辑 OR,而 ^ 运算符计算两个操作数的按位逻辑 XOR。这些运算不可能产生溢出。
2.枚举逻辑运算符
每个枚举类型 E 都隐式地提供下列预定义的逻辑运算符:
E operator &(E x, E y);
E operator |(E x, E y);
E operator ^(E x, E y);
x op y(其中 x 和 y 是具有基础类型 U 的枚举类型 E 的表达式,op 是一个逻辑运算符)的计算结果与 (E)((U)x op (U)y) 的计算结果完全相同。换言之,枚举类型逻辑运算符直接对两个操作数的基础类型执行逻辑运算(也就是枚举类型所返回的整数来计算)。
布尔逻辑运算符
预定义的布尔逻辑运算符为:
bool operator &(bool x, bool y);
bool operator |(bool x, bool y);
bool operator ^(bool x, bool y);
如果 x 和 y 均为 true,则 x & y 的结果为 true。否则,结果为 false。
如果 x 或 y 为 true,则 x | y 的结果为 true。否则,结果为 false。
如果 x 为 true 而 y 为 false,或者 x 为 false 而 y 为 true,则 x ^ y 的结果为 true。否则,结果为 false。当操作数为 bool 类型时,^ 运算符计算结果与 != 运算符相同。