GridView 事件以及使用

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")

或者:Label lbl = GridView1.Rows[e.RowIndex].FindControl("lblId") as Label;

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

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

if (lb1.Text== "True")

                       lb1.Text = "男";

                 else

                       lb1.Text = "female";

         }

     }


3
、RowType

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

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


4
、RowDeleting和RowDeleted事件

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

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

使用RowDeleted事件,可以在删除后,通过GridViewDeletedEventArgs的Exception属性判断删除过程中是否产生异常,如无异常,则可以显示类似于” 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 += "删除失败,请联系管理员";

}

5、RowEditing事件

在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;

}


6
、RowUpdating和RowUpdated事件

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 += "更新成功!";

     }


7
、Keys、OldValues、NewValues集合

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

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

在上面的例子中,为了把密码明文加密后再存入数据库,我们利用了NewValues字段,重新设置key为password的项的值。为了保证安全性,我们在更新数据前对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)
    {

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

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

 

 

 

 

 

 

 

 

 

 

 

 

 



DataGrid 控件最大的缺点之一 — 相反却是 GridView 控件最大的优点之一,是处理数据源更新的能力。当绑定数据源支持更新时,GridView 能够自动执行数据操作,从而提供真正的出盒解决方案。数据源控件通过一些布尔属性(例如 CanUpdate、CanDelete、CanSort 等)提供这些功能。

对 GridView 控件而言,数据编辑意味着就地编辑和记录删除。如前所述,就地编辑指网格支持更改当前显示记录的功能。启用 GridView 的就地编辑,需要启动 AutoGenerateEditButton 布尔属性:

<asp:gridview runat="server"
?? datasourceid="MySource"
?? autogenerateeditbutton="true">
?? ???
</asp:gridview>


当 AutoGenerateEditButton 属性设置为真时,GridView 显示附加的一列,如图 13 中最左边一列。单击一行的 Edit 按钮将此行置于编辑模式下。当一行处于编辑模式下时,非只读行的每个绑定字段将显示适当的输入控件,通常是一个 TextBox。当您单击更新时,GridView 引发 RowUpdating 事件并检查数据源的 CanUpdate 属性。如果 CanUpdate 返回值为假,则引发一个异常。否则,在数据源对象的 UpdateCommand 属性后创建和配置一个命令对象。

即使您对 SQL 的操作仅限于定义命令结构 — 只定义语句而让控件来完成其他操作,也无需使用 ADO.NET 或担心如何使用命令或连接。想在用户单击 Update 时保留更改,可编写以下代码:

<asp:sqldatasource runat="server" 
  connectionstring="SERVER=...;DATABASE=northwind;Integrated
  Security=SSPI;"
  updatecommand="UPDATE employees SET
          firstname=@firstname, lastname=@lastname
          WHERE employeeid=@employeeid">
</asp:sqldatasource>
<asp:gridview runat="server" 
  DataSourceId="MySource"
  DataKeyNames="employeeid" AutoGenerateEditButton="true">
  ???
</asp:gridview>

数据源的 UpdateCommand 属性被设置为 GridView 使用的 SQL 命令。您能够使用所需的任意数量的参数。如果您采用一种特殊的命名规则,参数值也能够自动解析。代表更新字段的参数(例如 firstname)必须与网格列的 DataField 属性名相匹配。用于标识工作记录的 WHERE 子句中使用的参数必须与 DataKeyNames 属性匹配,后者是显示记录的关键字段。最后,考虑这种情况:如果没有定义 UpdateCommand,却提交更改,那么 CanUpdate 返回值为假,并引发一个异常。RowUpdated 事件发出信号通知更新命令结束。通过更新命令更新的行数可在 RowUpdated 事件参数的 AffectedRows 属性中检索。

GridView 自动收集输入字段的值,填充 name/value 对词典,这个词典指示了每个行字段的新值。GridView 也公开一个 RowUpdating 事件,允许您修改正在传递到数据源对象的值。此外,在相关数据源上激发 Update 操作前,GridView 将自动调用 Page.IsValid。如果 Page.IsValid 返回值为假,将取消操作。这对使用包括验证程序在内的自定义编辑模板特别有用。

行删除操作方式与此相似。下面的 SQL 命令是一个数据源对象的 DeleteCommand 属性的合法内容:

DELETE employees WHEREemployeeid=@employeeid请注意,如果由于特定于数据库的约束而无法删除记录,删除操作将失败。例如,如果子记录通过某种关系引用父记录,父记录将无法删除。在这种情况下,引发一个异常。

GridView 控件不自动支持向数据源插入数据。没有这项功能完全是由于实现 GridView 不依赖于底层数据源的功能和特性。实际上,数据源对象提供一个 CanInsert 属性并支持一个 InsertCommand 属性。请注意,通过 GridView 和 DetailsView 控件的组合能够实现这个功能,一会您就会了解到。

GridView Web 服务器控件事件

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 控件完成到数据源的绑定后发生。

 

 

 

 

 

 

 

 

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using IOIOT.DataControl;

public partial class Admin_LinksOperation : System.Web.UI.Page
{
       DCAdmin dcadmin=new DCAdmin();
       DCPublic dcpub=new DCPublic();
       protected void Page_Load(object sender, EventArgs e)
       {
           if (!IsPostBack)
           {
               GVBind();
           }
       }


      //绑定
       private void GVBind()
       {
           DataTable dt = dcpub.SelectAllTable("Links", "", "", "CreateDate");
           GridView1.DataSource = dt.DefaultView;
           GridView1.DataBind();
       }
       //分页,需要设置AllowPaging="true"
       protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
       {
           GridView1.PageIndex = e.NewPageIndex;
           GVBind();
       }
    
       protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
       {
           GridView1.EditIndex = e.NewEditIndex;
           GVBind();
       }
      //取ID值需要设置DataKeyNames="LinkID"
       protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
       {
           int LID = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Value);
           string LinkText = ((TextBox)GridView1.Rows[e.RowIndex].FindControl("Elinktext")).Text;
           string LinkIMG = ((TextBox)GridView1.Rows[e.RowIndex].FindControl("Elinkimg")).Text;
           string LinkURL = ((TextBox)GridView1.Rows[e.RowIndex].FindControl("Elinkurl")).Text;
           try
           {
               dcadmin.Table_UPDATE("Links","LinkText='" + LinkText + "',LinkImg='" + LinkIMG + "',Address='" + LinkURL + "'", "LinkID=" + LID);
               PublichClass.MsgBox("更新成功", this.Page);
           }
           catch(Exception ex)
           {
               errmessage.Text="更新失败"+ex.Message;
           }
           GridView1.EditIndex = -1;
           GVBind();
       }
       protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
       {
           GridView1.EditIndex = -1;
           GVBind();
       }
       protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
       {
           int LID = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Value);
           try
           {
               dcadmin.Table_DELETE("Links", "LinkID=" + LID);
               errmessage.Text = "删除成功";
               PublichClass.MsgBox("删除成功", this.Page);
               GVBind();
           }
           catch (Exception ex)
           {
               errmessage.Text = "删除失败" + ex.Message;
           }
       }
      //排序,需要设置AllowSorting="true",同时在项里需要设置 SortExpression="LinkID"
       protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
       {
           if ((string)ViewState["Sort"] != e.SortExpression)
           {
               ViewState["Sort"] = e.SortExpression;
           }
           else
           {
               ViewState["Sort"] = e.SortExpression + " " + "DESC";
           }
           DataTable dt = dcpub.SelectAllTable("Links", "", "", "CreateDate");
           dt.DefaultView.Sort = ViewState["Sort"].ToString();
           GridView1.DataSource = dt.DefaultView;
           GridView1.DataBind();
       }
     //全选
       protected void AllLinkSelect_Click(object sender, EventArgs e)
       {
           CheckBox chkEbox;
           if (AllLinkSelect.Text == "全选")
           {
               foreach (GridViewRow gvrow in GridView1.Rows)
               {
                   chkEbox = (CheckBox)gvrow.FindControl("chbk");
                   chkEbox.Checked = true;
               }
               AllLinkSelect.Text = "取消";
           }
           else
           {
               foreach (GridViewRow gvrow in GridView1.Rows)
               {
                   chkEbox = (CheckBox)gvrow.FindControl("chbk");
                   chkEbox.Checked = false;
               }
               AllLinkSelect.Text = "全选";
           }
       }
      //删除选择项
       protected void LinkDel_Click(object sender, EventArgs e)
       {
           //删除其中选择项
           CheckBox chkbox;
           int LID;
           string DelStr = "";
           #region
           try
           {
               foreach (GridViewRow gridview in GridView1.Rows)
               {
                   chkbox = (CheckBox)gridview.FindControl("chbk");
                   if (chkbox.Checked == true)
                   {
                       LID = Convert.ToInt32(((HiddenField)gridview.FindControl("hfd_linkid")).Value);
                       DelStr += "LinkID=" + LID + " or ";
                       //dcadmin.Table_DELETE("News", "NewsID=" + NID);
                   }
               }
               if (DelStr.ToString().Trim().Length == 0)
               {
                   errmessage.Text = "没有选择任何项";
                   PublichClass.MsgBox("没有选择任何项", this.Page);
               }
               else
               {
                   DelStr = DelStr.Substring(0, DelStr.LastIndexOf("or"));
                   //删除选中的数据项
                   dcadmin.Table_DELETE("Links", DelStr);
                   //errmessage.Text = DelStr;
                   errmessage.Text = "选择项删除成功!";
                   PublichClass.MsgBox("选择项删除成功!", this.Page);
                   GVBind();
               }
           }
           catch (Exception ex)
           {
               errmessage.Text = "出错了!" + ex.Message;
           }
           AllLinkSelect.Text = "全选";
           #endregion
       }
       protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
       {
           int TTID;
           if (e.CommandName.ToString() == "topstep")
           {
               //向上移,Sort+1
               if (e.CommandArgument != null && e.CommandArgument.ToString() != "")
               {
                   //errmessage.Text = e.CommandArgument.ToString();
                   TTID = Convert.ToInt32(GridView1.DataKeys[Convert.ToInt32(e.CommandArgument)].Value);
                   int NowSort = Convert.ToInt32((dcpub.SelectAllTable("Links", "LinkID=" + TTID, "Sort", "")).Rows[0]["Sort"]);
                   int UpSort = NowSort + 1;
                   dcadmin.Table_UPDATE("Links", "Sort=" + UpSort, "LinkID=" + TTID);
                   DataTable dt = dcpub.SelectAllTable("Links", "", "", "Sort desc");
                   GridView1.DataSource = dt.DefaultView;
                   GridView1.DataBind();
               }
               else
                   //errmessage.Text = "没有参数";
                   errmessage.Text = "没有参数";
           }
           if (e.CommandName.ToString() == "bottomstep")
           {
               //向下移,Sort-1
               errmessage.Text = "22";
           }
       }
      //RowCommand事件需要添加CommandArgument
       protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
       {
           LinkButton totop;
           LinkButton tobottom;
           if (e.Row.RowType == DataControlRowType.DataRow)
           {
               totop = (LinkButton)e.Row.FindControl("totop");
               tobottom = (LinkButton)e.Row.FindControl("tobottom");
               if (totop != null)
               {
                   if (totop.CommandName == "topstep")
                       totop.CommandArgument = e.Row.RowIndex.ToString();
                   if (tobottom.CommandName == "bottomstep")
                       tobottom.CommandArgument = e.Row.RowIndex.ToString();
               }
           }
       }
}

 

posted on 2012-09-21 08:04  紫炎之心  阅读(197)  评论(0)    收藏  举报