【ASP.NET开发】菜鸟时期的.net笔记[about GridView]

.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)方法四:重新从数据源中获取值

这个方法优点是不受绑定的限制,但是缺点也很明显,那就是你要再访问一次数据库。我个人不推荐。

 

3.格式化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的第一列即可。另外这里可以进行各种权限判断,对不同的用户显示不同的数据。

标签