GridView

 

1.GridView 事件

GridView 控件可公开分页事件和排序事件,以及在创建当前行或将当前行绑定至数据时发生的事件。单击一个命令控件(例如,包含在 GridView 控件中作为其中的一部分的 Button 控件)时也会引发事件。下表描述了由 GridView 控件公开的事件。

RowCommand

GridView 控件中单击某个按钮时发生。此事件通常用于在该控件中单击某个按钮时执行某项任务。

PageIndexChanging

在单击页导航按钮时发生,但在 GridView 控件执行分页操作之前。此事件通常用于取消分页操作。

PageIndexChanged

在单击页导航按钮时发生,但在 GridView 控件执行分页操作之后。此事件通常用于在用户定位到该控件中不同的页之后需要执行某项任务时。

SelectedIndexChanging

在单击 GridView 控件内某一行的 Select 按钮(其 CommandName 属性设置为“Select”的按钮)时发生,但在 GridView 控件执行选择操作之前。此事件通常用于取消选择操作。

SelectedIndexChanged

在单击 GridView 控件内某一行的 Select 按钮时发生,但在 GridView 控件执行选择操作之后。此事件通常用于在选择了该控件中的某行后执行某项任务。

Sorting

在单击某个用于对列进行排序的超链接时发生,但在 GridView 控件执行排序操作之前。此事件通常用于取消排序操作或执行自定义的排序例程。

Sorted

在单击某个用于对列进行排序的超链接时发生,但在 GridView 控件执行排序操作之后。此事件通常用于在用户单击对列进行排序的超链接之后执行某项任务。

RowDataBound

GridView 控件中的某个行被绑定到一个数据记录时发生。此事件通常用于在某个行被绑定到数据时修改该行的内容。

RowCreated

GridView 控件中创建新行时发生。此事件通常用于在创建某个行时修改该行的布局或外观。

RowDeleting

在单击 GridView 控件内某一行的 Delete 按钮(其 CommandName 属性设置为“Delete”的按钮)时发生,但在 GridView 控件从数据源删除记录之前。此事件通常用于取消删除操作。

RowDeleted

在单击 GridView 控件内某一行的 Delete 按钮时发生,但在 GridView 控件从数据源删除记录之后。此事件通常用于检查删除操作的结果。

RowEditing

在单击 GridView 控件内某一行的 Edit 按钮(其 CommandName 属性设置为“Edit”的按钮)时发生,但在 GridView 控件进入编辑模式之前。此事件通常用于取消编辑操作。

RowCancelingEdit

在单击 GridView 控件内某一行的 Cancel 按钮(其 CommandName 属性设置为“Cancel”的按钮)时发生,但在 GridView 控件退出编辑模式之前。此事件通常用于停止取消操作。

RowUpdating

在单击 GridView 控件内某一行的 Update 按钮(其 CommandName 属性设置为“Update”的按钮)时发生,但在 GridView 控件更新记录之前。此事件通常用于取消更新操作。

RowUpdated

在单击 GridView 控件内某一行的 Update 按钮时发生,但在 GridView 控件更新记录之后。此事件通常用来检查更新操作的结果。

DataBound

此事件继承自 BaseDataBoundControl 控件,在 GridView 控件完成到数据源的绑定后发生。

在创建gridView控件时,必须先为GridView的每一行创建一个GridViewRow对象,创建每一行时,将引发一个RowCreated事件;当行创建完毕,每一行GridViewRow就要绑定数据源中的数据,当绑定完成后,将引发RowDataBound事件。如果说我们可以利用RowCreated事件来控制每一行绑定的控件,那么我们同样可以利用RowDataBound事件来控制每一行绑定的数据,也就是让数据如何呈现给大家。

还举同样的例子,在数据表中,存在性别列,上面我们用DropListDown控件的DataBounding来表示出了中文的性别,但是毕竟不太美观,我们现在可以利用Label控件和RowDataBound事件来实现完美的中文性别显示。RowDataBound

首先,还是把性别列,设置为模板列,并添加一个Label控件,将Label控件绑定到数据源的性别段,然后我们在GridView控件属性的事件列表中双击RowDataBound,生成如下事件:

Example

     protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)

{

//判断当前行是否是数据行

         if (e.Row.RowType == DataControlRowType.DataRow)

         {   //FindControl方法找到模板中的Label控件

Label lb1= (Label)e.Row.FindControl("Label1");

//因为RowDataBound是发生在数据绑定之后,所以我们可以

//判断Label绑定的数据,如果是True,就更改其text属性为男

                 if (lb1.Text== "True")

                       lb1.Text = "";

                 else

                       lb1.Text = "female";

         }

     }

 

3RowType

RowType可以确定GridView中行的类型,RowType是玫举变量DataControlRowType中的一个值。RowType可以取值包括 DataRowFooterHeaderEmptyDataRowPagerSeparator。很多时候,我们需要判断当前是否是数据行,通过如下代码来进行判断

    if (e.Row.RowType == DataControlRowType.DataRow)

 

4RowDeletingRowDeleted事件

RowDeleting发生在删除数据之前,RowDeleted发生在删除数据之后。

使用RowDeleting事件,可以在真正删除前再次确认是否删除,可以通过设置GridViewDeleteEventArgs.Cancel=True来取消删除;也可以用于判断当前数据库记录数,如果只剩一条记录且数据库不能为空则提示并取消删除操作。

使用RowDeleted事件,可以在删除后,通过GridViewDeletedEventArgsException属性判断删除过程中是否产生异常,如无异常,则可以显示类似于” 1 Records deleted之类的提示信息。

Example

     protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)

{

//取得当前行号,并取得当前行的GridViewRow对象

         int index=e.RowIndex ;

         GridViewRow gvr=GridView1.Rows[index];

//取得当前行第二个单元格中的文字

         str1 = gvr.Cells[1].Text;

//进行提示

         Message.Text   ="您将删除一个用户,其姓名为"+str1 ;

     }

     protected void GridView1_RowDeleted(object sender, GridViewDeletedEventArgs e)

{

//如果没有产生异常,则提示成功删除,否则提示删除失败

         if (e.Exception == null)

             Message.Text += "<br>您成功删除了"+str1 ;

         else

             Message.Text += "删除失败,请联系管理员";

}

5RowEditing事件

GridView中的行进入编辑模式之前,引发RowEditing事件,如果您需要在编辑记录前进行某些预处理,可以在这里操作。如果想取消对当前行的编辑,可以把GridViewEditEventArgs 对象的 Cancel 属性设置为 true即可。

Example

     protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)

{

//NewEidIndex取得当前编辑的行号,然后获取gridviewrow对象

         GridViewRow gvr = GridView1.Rows[e.NewEditIndex];

 

//判断,如果当前编辑行姓名栏为admin用户,则取消对当前行的编辑

         if (gvr.Cells[1].Text =="admin")

             e.Cancel = true;

}

 

6RowUpdatingRowUpdated事件

RowUpdating事件发生在更新数据源之前,RowUpdated发生在更新数据源之后。

我们可以在记录更新前利用RowUpdating做一些预处理工作,比如修改密码时,因为密码在数据库中不是明文存储,进行了hash,所以在更新密码前,应该生成其hash值,再进行更新操作。RowUpdated则可以检验更新是否成功。

Example

     protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)

     {

         GridViewRow gvr = GridView1.Rows[GridView1 .EditIndex   ];

//寻找输入密码的控件

         TextBox tb1 = (TextBox)gvr.FindControl("tb_password");

//将此控件中的文本hash后,把password存入NewValues这个字典中

         e.NewValues ["password"] =tb1.Text .GetHashCode().ToString () ;

     }

     protected void GridView1_RowUpdated(object sender, GridViewUpdatedEventArgs e)

{

//如无异常,则更新成功

         if (e.Exception == null)

             Message.Text += "更新成功!";

     }

 

7KeysOldValuesNewValues集合

Keys字典中一般存放的是数据源中的主键字段的keyvalue的对应值,如果主键由多个字段组成,那么Keys为每个键字段添加其字段名称和值。OldValues中存放的是要更新的行的字段名和原始值,每个字段为其中的一项。NewValues中存放的是要更新的行的字段名和修改后的值,每个字段为其中的一项。注意,主键字段只存放于keys集合中。

这三个集合中的每一项都是DictionaryEntry类型的对象,我们可以用DictionaryEntry.Key来确定一个项的字段名称,DictionaryEntry.Value来确定某项的值。

在上面的例子中,为了把密码明文加密后再存入数据库,我们利用了NewValues字段,重新设置keypassword的项的值。为了保证安全性,我们在更新数据前对NewValues中的所有值进行html编码:

Example1:

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)

{

//遍历NewValues,取得其中每一对DictionaryEntry对象

        foreach (DictionaryEntry de in e.NewValues)

 

//de.key就是字段名,如果此处单独更新某字段的话,也可以直接填写字段名,//比如 e.NewValues[password]

 

        e.NewValues[de.Key] = Server.HtmlEncode(de.Value.ToString());

     }

 

Example2:

     protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)

    {

         //分别利用KeysOldValuesNewValues取得主键名、原始数据和更新后数据

         Message .Text   = e.Keys["username"] + "email地址从" + e.OldValues["email"] + "变更为" + e.NewValues["email"];

2.GridView内容详解

 

GridViewASP.NET界面开发中的一个重要的控件,对GridView使用的熟练程度直接影响软件开发的进度及功能的实现。(车延禄)

GridView的主要新特性:

    1.DataSource控件结合实现了显示与数据操作的分离,大大减化了代码的编写量;

    2.实现"双向绑定",无需手动检索数据。

    2.在列的类型上新增了CheckBoxFieldImageField两个类型列;

    3.对排序和分页可以实现异步操作;

    4.对其视图状态进行优化,使其运行效率更高;

    

GridViewDataSource控件

    要谈GridView就必需要谈DataSource,这两个对象可称得上是“最佳拍档”。DataSource控件负责与数据源的交互,而GridView负责数据的显示。它们之间通过“双向绑定”联系起来,即DataSource控件将检索出来的数据绑定到GridView中显示,而GridView中修改和删除的数据直接绑定到DataSource数据源去。这两个过程由这两个控件相互配合实现的,无需我们编写代码。如果我们只用GridView显示数据,而不用DataSource控件的话,那你只好编写代码实现DataSource要作的工作了。做为用过VS2003的用户对这个工作并不陌生,但这种代码实现不但工作量大,而且使用复杂,容量产生大量可读性差的代码,当然也是初学者的最大障碍。好在VS2005为我们提供了DataSource控件,使我们不再如此痛苦地Coding了(当然,如果有的情况下DataSource控件还无法完全替代Coding)。

    所以在使用GridView控件的时候我们最好配合DataSource控件使用,不要再去折磨自己了。下面的案例不做特殊说明均以GridView+DataSource控件实现。

一、GridView外观设置:

    1、总体外观设置

     ShowFooter(bool)是否显示页脚

     ShowHeader(bool)是否显示页眉

     GridLines(enum)None-不显示格线;Horizontal-显示水平格线;Virtical-显示竖直格线;Both-显示水平和竖直格线

     EmptyDataText(string)如果数据源中内容为NULL时在GridView中显示的值

        AlternatingRowStyle:交替项的样式

        EditRowStyle:编辑项的样式

        EmptyDataRowStyle:空数据项的样式

        FooterStyle:页脚样式

        HeaderStyle:页眉样式

        PagerStyle:分页样式

        RowStyle:行样式

        SelectedRowStyle:选中项样式

        注:1、使用GridView的时候我们一般可以使用“自动套用样式”选中一个样式,然后在此样式的基础上修改上面的属性,从而制作出满意外观效果。

            2、上面的样式可以对GridView进行总体的外观设置,如果对某一列进行设置的话那可要在GridView右上角“智能菜单中”点击“编辑列”进行设置。

posted @ 2013-11-26 23:54  weifb  阅读(331)  评论(0)    收藏  举报