最近在用GridView的时候用到FindControl()在TemplateField中发现总是Find不到,在网上搜索了一下,发现很多朋友跟我遇到的问题一样,而且网上很多人的解决方法不是很好,我自己总结了一下:
     对于在RowDataBound中Find,可以用if (e.Row.RowType == DataControlRowType.DataRow)来限制Find的范围,因为Find默认是在HeaderTemplate中找,如果不限定范围,在HeaderTemplate中找不到,自然就返回null,然后就出错了,DataControlRowType枚举中的DataRow确定是数据行.
     另一个是在RowCommand中,我发现遇到这个问题的朋友貌似比上一个要多,在RowCommand中,如果使用GridView默认的模式,e.CommandArgument自动棒定为该行的Index,这时候只要指定gridview1.Rows[Convert.ToInt32(e.CommandArgument)].FindControl("xxx")就可以了,但是如果转化为Template,e.CommandArgument并不会自动绑定任何值,需要手动绑定,可以在<ItemTemplate></ItemTemplate>手动写CommandArgument="<%# ((GridViewRow) Container).RowIndex %>",把这个行的 Index绑定绑定到该e.CommandArgument就可以了.很多初学者在这里不明白为什么要这么做,其实我也是初学者,简单的说一下,就是行是根据数据循环的,每一行都有同样的控件,如果不指定行的Index,简单的写gridview1.findcontrol("xxx"),IDE并不知道要找哪个控件所以要指定行号.