注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

一车,一房,一个温暖家

10万左右的车,80平方的房子,这是我奋斗的暖暖的家

 
 
 

日志

 
 

引用 GridView 事件和用法   

2015-06-19 07:21:50|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
本文转载自jinqiyulv《GridView 事件和用法》

事件名称            说明 
  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 继承。)  
慢慢来~~

一、GridView绑定初始化的事件发生顺序
GridView
显示绑定的数据(默认为5)
DataBinding
RowCreated:Header[0]
RowDataBound
RowCreated:DataRow[1]
RowDataBound
RowCreated:DataRow[2]
RowDataBound
RowCreated:DataRow[3]
RowDataBound
RowCreated:DataRow[4]
RowDataBound
RowCreated:DataRow[5]
RowDataBound
RowCreated:Footer[6] //
不管有没有页角行,该事件都会发生
RowDataBound
RowCreated:Pager[7]
RowDataBound
DataBound

顺序如下:
DataBinding
RowCreated
RowDataBound
......
DataBound
二、GridView点击分页按钮时的事件发生顺序:
RowCommand
PageIndexChanging
PageIndexChanged
DataBinding
RowCreated:Header[8]
RowDataBound
RowCreated:DataRow[9]
RowDataBound
RowCreated:DataRow[10]
RowDataBound
RowCreated:DataRow[11]
RowDataBound
RowCreated:DataRow[12]
RowDataBound
RowCreated:DataRow[13]
RowDataBound
RowCreated:Footer[14]
RowDataBound
RowCreated:Pager[15]
RowDataBound
DataBound

总结:
GridView绑定数据开始,也就是触发DataBounding事件后,这时已经把数据从数据源取出或者说已经规定了那些数据字段将会被取出,其中 的Visible属性为false的字段的值是不会从数据源中获取的。这就是为什么当GridView使用直接在html中将Visible=false 来隐藏某一列时,会得不到该列的值。然后调用RowCreated事件把一行数据全部填充到一个gridViewRow里面,然后触发 RowDataBound事件把该行绑定到GridViewRows中。一直到最后触发GridViewDataBound来绑定显示数据。

 

GridView
RowCreatedRowDataBound的一个区别在于RowCreated事件是这样的,不管数据是不是重新绑定到GridView,只要在 GridView里新增一行记录就将引发RowCreated事件。那意味着,当发生PostBack回传事件时,哪怕数据来自视图状态,也会引发 RowCreated事件。

我们使用RowCreated事件而不使用RowDataBound事件的原因在于,只有当数据明确的绑定到数据Web控件时才会引发RowDataBound事件

 

GridView的用法

一、常规列属性
1.BoundField
此类型的列是将数据表中的字段内容用文本的方式显示出来。

2.CheckBoxField(不常用)
常用来显示数据库中的布尔类型字段的值

3.HyperLinkField
显示一个链接,此类型字段常用,其主要属性是:
DataNavigateUrlFields
DataNavigateUrlFormatStringDataTextFieldDataTextFormatString
如:要在此列中形成一个链接,链接的文字是公司名称,链接到查看公司详细信息的页面:ViewCompany.aspx,并且页面后要跟一个参数 ID=xxxx。第一条记录ID=ALFKICompanyName=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有三个选项,LinkImageButton,表示了按钮的三种表现形式,分 别对应着工具箱中的LinkButtonImageButtonButton三种控件。
当按钮被Click之后,会触发GridView“RowCommand”事件,按钮被点击后执行什么样的程序,要在RowCommand事件中去写。
有这样一个问题:如果一个GridView中有多个Button列,但只有一个RowCommand事件,那么如何知道当前是哪一列的ButtonClick了呢?这就需要通过ButtonField列的CommandName属性来指定。
如:有两个ButtonField列,将第一列的CommandName属性设置为这是第一列,将第二列的CommandName属性设置为这是第二列
选中GridView控件,在属性面板事件页中双击RowCommand事件后的空格。

再在aspx.cs文件中的GridViewRowCommand事件中程序如下书写:
    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之所以灵活就灵活在 这个模板列。在列定义的对话框中加入一个模板列,只设置HeadTextItemStyle.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属性会经常用到,这里单独讲一下。比如:有一个删除按钮列,点击删除后,要删除当前行,但是你怎么从后台程序中获 取到当前行的关键字段的值呢?方法有多种,但最可靠的方法还是通过GridViewDataKeys属性。下面程序是示范:
1.
在进行数据绑定之时,设置DataKeyNames属性的值:
        this.GridView1.DataSource = ds.Tables[0];
        this.GridView1.DataKeyNames = new string[] { "CustomerID", "CompanyName" };
        this.GridView1.DataBind();
此行程序的作用是将CustomerIDCompanyName两个字段的值放入到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 继承。)


转自http://www.cnblogs.com/neru/archive/2010/08/12/1797771.html

 

  评论这张
 
阅读(25)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018