GridView的用法
将GridView控件由“工具箱”拖至aspx页面合适位置,由会自动生成一个GridView的控件编辑视图,默认控件ID是GridView1。在aspx.cs文件中写入下面的程序代码即可以显示DataTable或DataReader中数据。
GridView1.DataSource=dt; //或是=reader;之类的
GridView1.DataBind(); //执行此方法后,数据才会真正绑定并显示出来
在浏览器中查看页面,会发现所有字段全部显示在页面上,如下图所示:
图中用红色标出的部分是每一更的"HeaderText"属性,默认是采用的该列的字段名称。
二、设置列属性
在基本用法中,是自动将DataTable中所有的字段全部显示出来,但在实际中,往往只需要显示所需要的字段,这就需要设置GridView中列的属性。
GridView是由许多“列”对象组成,可以在GridView对象中看到有一个Columns的属性。可以通过设置列的属性达到我们所需要的显示效果。
如上两图所示,进行编辑列的界面,先选中GridView控件,然后即可以通过aspx页面控件上的右向箭头点击菜单进入,也可通过属性的"Columns"编辑按钮进入。
列编辑界面如下:
上图就是列编辑的对话框,红色框标识出基本的属性界面功能。除了“DataField”和“HeaderText”两个属性外,还有一个定义列宽的属性也经常用,在“样式”分类中的“ItemStyle”属性群里有一个“Width”属性,既可定义固定的宽度(如100px),也可定义为百分比(如:50%)。
在上图所示的对话框中,演示了“BoundField”类型的字段,此类型的字段是将数据表中的字段值以文本的方式进行显示,相对来说功能较为简单。除了图中演示的“BoundField”,还有其它类型的字段,下面就分别介绍其它常规列的使用。
三、常规列属性
1.BoundField
此类型的列是将数据表中的字段内容用文本的方式显示出来。
2.CheckBoxField(不常用)
常用来显示数据库中的布尔类型字段的值
3.HyperLinkField
显示一个链接,此类型字段常用,其主要属性是:
DataNavigateUrlFields、DataNavigateUrlFormatString、DataTextField、DataTextFormatString
如:要在此列中形成一个链接,链接的文字是“公司名称”,链接到查看公司详细信息的页面:ViewCompany.aspx,并且页面后要跟一个参数ID=xxxx。第一条记录ID=ALFKI,CompanyName=Alfreds Futterkiste,其生成的链接应该是ViewCompany.aspx?ID=ALFKI,其链接文本为“Alfreds Futterkiste”,以上四个属性定义的值如下:
DataNavigateUrlFields 的值为 "CustomerID"
DataNavigateUrlFormatString 的值为 "ViewCompany.aspx?id={0}",在生成时,{0}就会用DataNavigateUrlFields属性所定义的字段的值进行替换。
DataTextField的值为"CompanyName"
DataTextFormatString的值为"{0}",也就是只显示其公司的名称,无其它多余文字。显示效果如下图所示:
4.ImageField(不常用)
用于显示存储图片的二进制类型字段的数据,直接将二进制字段存储的图片数据显示为图片,但此字段在VS2005之后去掉了DataField属性,加入了DataImageUrlField字段,其意思是不再支持直接显示二进制内容为图片,而是需要自己再写一个显示页面,在这个页面去读取二进制字段内容,并将其输出为图片内容。此字段不常用。
5.ButtonField
此列显示为“按钮”,注意:按钮并不只是HTML语言中的<input type="button"...>这一种类型,在asp.net中,能够完成将表单(页面)提交(PostBack)到服务器动作的控件都可以称之为“按钮”,因此,此类型的字段有一个属性:ButtonType有三个选项,Link、Image、Button,表示了“按钮”的三种表现形式,分别对应着“工具箱”中的LinkButton、ImageButton、Button三种控件。
当按钮被Click之后,会触发GridView的“RowCommand”事件,按钮被点击后执行什么样的程序,要在RowCommand事件中去写。
有这样一个问题:如果一个GridView中有多个Button列,但只有一个RowCommand事件,那么如何知道当前是哪一列的Button被Click了呢?这就需要通过ButtonField列的CommandName属性来指定。
如:有两个ButtonField列,将第一列的CommandName属性设置为“这是第一列”,将第二列的CommandName属性设置为“这是第二列”。
选中GridView控件,在“属性面板”的“事件”页中双击RowCommand事件后的空格。
再在aspx.cs文件中的GridView的RowCommand事件中程序如下书写:
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
switch (e.CommandName)
{
case "这是第一列":
//此处请写被点击后需要处理的事务
Response.Write("第一列被点击");
break;
case "这是第二列":
//此处请写被点击后需要处理的事务
Response.Write("第二列被点击");
break;
}
}
6.CommandField
此列的实质与ButtonField列没有任何区别,唯有的区别就是不需要再设置CommandName属性,而是每一种按钮对应了GridView的一种事件,而不是RowCommand事件,如:编辑按钮对应着RowEditing事件,删除按钮对应着RowDeleting(删除之时)和RowDeleted(删除之后)两个事件,以此类推,这里就不一一列举。也不再举例。
四、模板列
前面几个类型的列,把它们统称为“常规列”,模板列(Template)与之前的几个列的区别在于:之前的列都相当于一个单个的控件,而此列相当于一个容器,在容器中又可以拖入多个控件,构成更复杂的单元格内容。GridView之所以灵活就灵活在这个模板列。在列定义的对话框中加入一个模板列,只设置HeadText和ItemStyle.Width等属性,再点击确定关闭对话框。在aspx页面中选中GridView控件并点击右向箭头,如下图所示:
点击“编辑模板”进入下面界面:
可以看到,右方的下拉列表中列出了模板列的名称,如果有多个模板列,则会列出多个模板列的名称,每个模板下有多个Template,我们一般只需要编辑ItemTemplate,其它的Template大家可以根据其名称推测其作用。
ItemTemplate就是“容器”,可以将“工具箱”中的控件拖入其中。上图中就拖入一个Image控件,一个Button控件和一个CheckBox控件。
选中这些控件,并在属性面板中将其ID改为有意义的名称。其具体的用法在后面再讲。
模板列编辑结束后,点击右向箭头选择“结束模板编辑”。
五、RowDataBound事件
上面只是定义了模板列,如果要其显示出每条记录的相应信息,还需要将模板列中的控件属性赋值,这个动作一般放在GridView的RowDataBound事件中去完成。双击属性面板的动作页,定义一个RowDataBound事件。假定刚才定义的三个控件其ID分别为:imgTemp,btnTemp,cbTemp,则aspx.cs文件示范程序如下:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if(e.Row.RowIndex < 0) //如果正在生成表头
return;
DataRowView drv = (DataRowView)e.Row.DataItem; //将绑定当前行的数据行视图取出
Image img = (Image)e.Row.FindControl("imgTemp");
img.ImageUrl = drv["ImageUrl"].ToString(); //假定数据表中有一个ImageUrl的字段
Button btn = (Button)e.Row.FindControl("btnTemp");
btn.Text = drv["CompanyName"].ToString();
CheckBox cb = (CheckBox)e.Row.FindControl("cbTemp");
cb.Checked = (drv["IsSelect"].ToString() == "1" ? true : false); //假定数据表中有一个IsSelect字段,1表示选中,0表示未选中。
}
上面这段程序是一个示范,并不是完全按照示范表Customer表中的字段进行设置。其过程为:
1.将e.Row.DataItem强制转换为DataRowView对象,这个对象就是绑定到此行的数据表DataTable中的一条DataRow的视图,其用法与DataRow类似。
2.通过e.Row.FindControl方法找到指定ID的那个模板中的控件
3.通过一定的计算,将DataRowView中的值转换为控件的属性。
不仅模板列可以在RowDataBound事件中进行操作,常规列也可以,但不是用FindControl方法,以下例为示范,要获取第2列公司名称这个HyperLinkField类型的常规列中的HyperLink对象,在RowDataBound事件中写下面这行程序:
HyperLink hl = (HyperLink)e.Row.Cells[1].Controls[0];
因为此列位于该表的第二列,因此Cells[1]表示该单元格,此单元格中只有一个控件,因此为Controls[0]。
再如:在删除动作列中的删除按钮上加一个JavaScript动作,每次点击删除按钮时,先在页面通过JavaScript弹出一个确认对话框,可以按如下步骤操作:
1.在列编辑对话框中添加一个“删除”按钮列,按钮类型为Button,假定是在表格的第4列
2.在RowDataBound中如此写:
Button btDel = (Button)e.Row.Cells[3].Controls[0];
bt.Attributes.Add("OnClick", "return confirm('您是否确认删除此条记录?')");
在浏览器中查看此表格的HTML源码时,就会发现每一个删除按钮都有如此一段HTML属性:
OnClick="return confirm('您是否确认删除此条记录?')"
return confirm('.....')是一句JavaScript语句,根据用户在弹出的对话框中选择的项来决定返回的值,如果选择“是”,则返回true,则此按钮所触发的提交表单继续进行;反之,返回false,则此按钮所触发的提交表单事情停止,删除动作就不会完成。
六、DataKeys属性
GridView有一个DataKeys属性会经常用到,这里单独讲一下。比如:有一个删除按钮列,点击删除后,要删除当前行,但是你怎么从后台程序中获取到当前行的关键字段的值呢?方法有多种,但最可靠的方法还是通过GridView的DataKeys属性。下面程序是示范:
1.在进行数据绑定之时,设置DataKeyNames属性的值:
this.GridView1.DataSource = ds.Tables[0];
this.GridView1.DataKeyNames = new string[] { "CustomerID", "CompanyName" };
this.GridView1.DataBind();
此行程序的作用是将CustomerID和CompanyName两个字段的值放入到DataKeys数组中。
2.在GridView1_RowDeleting事件中写如下程序:
string id = this.GridView1.DataKeys[e.RowIndex]["CustomerID"].ToString();
string name = this.GridView1.DataKeys[e.RowIndex]["CompanyName"].ToString();
这样就获取到了当前行记录在DataKeys数组中的值。
七、事件
DataBinding 当服务器控件绑定到数据源时发生。(从 Control 继承。)
DataBound 在服务器控件绑定到数据源后发生。(从 BaseDataBoundControl 继承。)
Disposed 当从内存释放服务器控件时发生,这是请求 ASP.NET 页时服务器控件生存期的最后阶段。(从 Control 继承。)
Init 当服务器控件初始化时发生;初始化是控件生存期的第一步。(从 Control 继承。)
Load 当服务器控件加载到 Page 对象中时发生。(从 Control 继承。)
PageIndexChanged 在单击某一页导航按钮时,但在 GridView 控件处理分页操作之后发生。
PageIndexChanging 在单击某一页导航按钮时,但在 GridView 控件处理分页操作之前发生。
PreRender 在加载 Control 对象之后、呈现之前发生。(从 Control 继承。)
RowCancelingEdit 单击编辑模式中某一行的“取消”按钮以后,在该行退出编辑模式之前发生。
RowCommand 当单击 GridView 控件中的按钮时发生。
RowCreated 在 GridView 控件中创建行时发生。
RowDataBound 在 GridView 控件中将数据行绑定到数据时发生。
RowDeleted 在单击某一行的“删除”按钮时,但在 GridView 控件删除该行之后发生。
RowDeleting 在单击某一行的“删除”按钮时,但在 GridView 控件删除该行之前发生。
RowEditing 发生在单击某一行的“编辑”按钮以后,GridView 控件进入编辑模式之前。
RowUpdated 发生在单击某一行的“更新”按钮,并且 GridView 控件对该行进行更新之后。
RowUpdating 发生在单击某一行的“更新”按钮以后,GridView 控件对该行进行更新之前。
SelectedIndexChanged 发生在单击某一行的“选择”按钮,GridView 控件对相应的选择操作进行处理之后。
SelectedIndexChanging 发生在单击某一行的“选择”按钮以后,GridView 控件对相应的选择操作进行处理之前。
Sorted 在单击用于列排序的超链接时,但在 GridView 控件对相应的排序操作进行处理之后发生。
Sorting 在单击用于列排序的超链接时,但在 GridView 控件对相应的排序操作进行处理之前发生。
Unload 当服务器控件从内存中卸载时发生。(从 Control 继承。)