gridview的用法

GridView的用法
2007-12-30 17:10

前面几讲实现了从数据库读取数据到内存,如何将内存中的数据用二维表的方式进行显示呢?Asp.net提供了一个功能十分灵活的GridView服务器控件,可以方便的进行数据的显示。
一、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数组中的值。

七、小结
GridView的功能十分灵活,通过以上介绍的知识进行举一反三的思考,可以变化出许许多多的显示效果,通过这个控件,完全能够实现各种各样的数据表现形式。为了激发大家的思维,下一节是转载一位网友所写的GridView控件的灵活用法。


 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值