.net 笔记摘自《ASP.NET 2.0 第一步》,感谢原作者的指导。
初学者要显示数据的时候,我想GridView控件会是最常用的一个,这篇博文就讲一下GridView的一些用法
正文
1.设定GridView的按钮事件
GridView中的按钮被单击后会触发RowCommand事件,我们可以通过为不同的按钮设置不同的CommandName来区分触发事件的按钮。
eg:
<asp:ButtonField CommandName="Del" ButtonType="Button" Text="Del" HeaderText="del" />
在事件中的代码:
if(e.CommandName=="Del") { int iIndex=Convert.ToInt16(e.CommandArgument); Response.Write(iIndex+1); }
这里首先根据命令名来区分触发事件的按钮,然后从e.CommandArgument就能获取触发事件的行索引号
2.如何获得所选行的主键
GridView提供了DataKey集合,用来存放每一行数据的主键,首先设置GridView的DataKeyNames属性为数据表的主键,若有多个主键则用逗号分隔,然后在代码中使用这个属性来获取主键:GridView1.DataKey[iIndex];
有了主键值,要进行删除操作就简单得多了。
注意:操作结束后,要立即重新指定数据源,并使用绑定方法重新绑定。
对于删除操作,一般要增加一个用户确认对话框,这个可以用脚本语言写,另外,如果我们将此列转换为模版列之后,我们必须手动绑定索引号以便在后台获取所选的索引号,用CommandArgument='<%# Container.DataItemIndex %>' 绑定索引号。嗯,应该是这样。
3.如何在RowCommand中获得GridView行的非主键数据
(1)方法一:手动指定控件的CommandArgument
这个方法的原理是把数据直接绑定到按钮的CommandArgument中,缺点是只能绑定一个数据。eg:CommandArgument='<%# Eval("UserName") %>'
(2)方法二:直接从GridView中获取值
这个方法的优点是能获取多个值,缺点是值必须是显示在GridView上的。我们唯一要知道的参数就是行的索引号。
eg:
int iIndex= Convert.ToInt16(e.CommandArgument); GridViewRow gvr = GridView1.Rows[iIndex]; string sUserName = GridView1.Cells[0].Text; //这个是模版列里的Hyperlink,所以用FindControl方法根据控件ID找出它( Control类型)然后转换成Hyperlink类型,再取其值。Hyperlink是Cell的子控件,Cell是DataGridView的子控件。 string sUserEmail = (GridView1.Cells[1].FindControl("HyperLink1") as HyperLink).Text;
(3)方法三:使用隐藏域来保存值
优点是数据可以是数据源中的任意数据,不一定是需要绑定在GridView上的数据,缺点是不宜存放过大的数据,否则会造成页面体积急剧增加。
eg:
<input type="hidden" runat="server" id="hid_UserName" value='<%# Eval("UserName") %>' />
RowCommand事件代码:
int iIndex= Convert.ToInt16(e.CommandArgument); GridViewRow gvr = GridView1.Rows[iIndex]; string sUserName = (gvr.FindControl("hid_UserName") as HtmlInputHidden).Value;
(4)方法四:重新从数据源中获取值
这个方法优点是不受绑定的限制,但是缺点也很明显,那就是你要再访问一次数据库。我个人不推荐。
4.格式化GridView
为什么要格式化GridView的数据?
有时候我们在GridView中显示的数据并不直接是数据库中存储的数据,打个比方,我们存储一个人的性别时,一般用1代表男性,0代表女性,但是我们在GridView中并不能直接显示0或1,因此我们就需要格式化从数据库中读取的数据,也就是被绑定的数据源的数据。
那怎么格式化GridView?
(1)方法一:在GridView的绑定列中使用DataFormatString属性进行格式化
eg: <asp:BoundField XXXXXXX.... DataFormatString="<i>{0}</i>" />
可以看到这一列用斜体字显示。
(2)方法二:在GridView的模版列的绑定标签中直接使用各种运算和表达式进行格式化
eg: <asp:TemplateField XXXXXXX.... >
<ItemTemplate>
<%# Eval("UserName").ToString()*1123/1234+100 %>
</ItemTemplate>
</asp:TemplateField>
(3)方法三:在GridView的模版列的绑定标签中调用后台方法进行格式化
其实这个方法和方法二很相似,只是对数据的格式化代码放到后台而已。
eg: <asp:TemplateField XXXXXXX.... >
<ItemTemplate>
<%# DealData(Eval("UserName").ToString()) %>
</ItemTemplate>
</asp:TemplateField>
后台代码:
int DealData(string str)
{
return 0;
}
(4)方法四:在GridView的绑定事件处理方法RowDataBound中读取数据源的数据并为GridView赋值
eg:
GridViewRow gvr=e.Row; if(gvr.RowType == DataControlRowType.DataRow) { string sUserName = DataBinder.Eval(gvr.DataItem,"UserName").ToString(); gvr.Cells[0].Text = string.Format("<i>{0}</i>",sUserName); }
我们可以从e.Row中直接得到当前绑定行的GridViewRow。注意,在GridView绑定的过程中每绑定一行RowDataBound都会触发一次。然后,我们判断这个行是不是数据行(而不是页眉行或脚注行),如果是的话就可以从GridViewRow的DataItem中获取数据行,在进行格式化后赋值给sUserName字符串,最后把字符串显示在GridViewRow的第一列即可。另外这里可以进行各种权限判断,对不同的用户显示不同的数据。