gridview应用

gridview 事件学习:

一、事件说明

      1.1RowCommand

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

1.2PageIndexChanging

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

1.3PageIndexChanged

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

1.4SelectedIndexChanging

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

1.5SelectedIndexChanged

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

1.6Sorting

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

1.7Sorted

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

1.8RowDataBound

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

1.9RowCreated

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

1.10RowDeleting

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

1.11RowDeleted

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

1.12RowEditing

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

1.13RowCancelingEdit

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

1.14RowUpdating

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

1.15RowUpdated

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

1.16DataBound

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

二、获得主键

    首先我们为 Gridview 增加一个新的空白列,如下:
    <asp:BoundField  HeaderText="序号">
                <ItemStyle HorizontalAlign="Center" Width="26px" />
                </asp:BoundField>

    在 GridView RowDataBound 事件中编写代码,如下:
    protected void RowDataBond1(object sender, GridViewRowEventArgs e)
    {
             if (e.Row.RowIndex > -1)
            {
             
             e.Row.Cells[0].Text = Convert.ToString(e.Row.RowIndex + 1);
            }
              
      }

           这样就会有一个自动编号的列出来了,那么我们要对某一列进行操作的时候就不能用cells[0].text的方法了,那样得到的ID号和数据库里的并不对应,所以我们要用主键的方法,我们首先在GridView的属性中的DataKeyNames里面写上我的的表主键,然后在到方法里用语句把这个值取出来,我们就知道用户是要对哪一列进行操作了,下面写出了几个在事件中取出主键值的方法,以供参考。

    我们最常用的,当然就是RowDataBound方法了

    在 GridView1_RowDataBound中获取主键的值
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        int index = GridView1.DataKeys[e.Row.RowIndex].Value;
    }

    其次就是删除事件

    在 GridView1_RowDeleting中获取主键的值
    protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        int
    index
    =GridView1.DataKeys[e.RowIndex].Value;
    }

    分页事件

    在 GridView1_PageIndexChanging中获取主键的值

    protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        int index=GridView1.DataKeys[e.NewPageIndex].Value;
    }

    还有其它几个不常用的:

    在 GridView1_RowCommand中获取主键的值:

    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
           int index = GridView1.DataKeys[Convert.ToInt32(e.CommandArgument)].Value;
    }

    在 GridView1_RowEditing中获取主键的值
    protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
    {
         int index = GridView1.DataKeys[e.NewEditIndex].Value;
    }

    在 GridView1_RowUpdating中获取主键的值

    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
         int index = GridView1.DataKeys[e.RowIndex].Value;
    }

    三 事件

  3.1.RowCommand 事件

     当ButtonField按钮字段被按下时,GridView控件会引发RowCommand事件,

      若要判断引发命令事件之数据行的索引,请使用事件自变量的CommandArgument属性,会将该事件自变量传递至数据绑定控件的命令事件,ButtonField类会自动用适当的索引值填入CommandArgument属性。在事件响应函数中可以根据不同的CommandName来做不同的操作。

从事件中判断e.CommandName和对第几行进行的操作e.CommandArgument。

  前台页面

<asp:TemplateField HeaderText="操作">
    <ItemTemplate>

//删除操作
      <asp:ImageButton runat="server" ImageUrl="../images/delete_16x16.gif"
                                            Style="position: relative" CommandArgument='<%#Eval("product_id") %>' CommandName="del"   OnClientClick="return confirm('确认删除这条单据吗?')" />&nbsp;

//超链接
  <a href="addXuni.aspx?id=<%#Eval("product_id").ToString()%>&modify=1">
                                           //绑定图片 <img  src="../images/edit_16x16.gif"  border="0" /></a>
                                    </ItemTemplate>

</asp:TemplateField>

后台代码:

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "del")
            {
               int index = Convert.ToInt32(e.CommandArgument);
               Boolean flag = CardInfoListManager.DeleteCardInfoListById(index);
               if (flag == true)
               {
                   this.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('删除成功!')</script>");
                   Bind();
               }
            }
        }

3.2.RowDataBound事件
3.2.1. Cells[x].Txt。
    从列单元格的文本值获取。这种方法简单高率,最为常用,但是功能单纯。此法存在几个缺点:
    (1)无法获取到设置了隐藏属性的数据列的值,所取到的值为“”(空)。
    (2)只能获取在HTML中定义过的数据列,无法查询数据源中的当前数据行的所有字段列。一般情况下,通过HTML设置GridView的字段列的数量往往小于数据源的实际字段数量,这是因为从业务逻辑的角度看,并不是所有的字段都是要显示在页面上的。当需要使用没有被显示的字段时,此法就不能直接满足需求了。

3.2.2. e.Row.Cells[x].FindControl("YourcontrolName")。
    这是在单元格内查找某个服务器控件,从而获得其数据值。这种方式可以操作单元格内的服务器控件。此法一般用于处理模板列中的数据或控件。

3. (DataRowView)e.Row.DataItem).Row.ItemArray[x].ToString()。
    此法的核心是e.Row.DataItem,它是GridView的行数据集,为Object类型,将其转化为DataRowView类型后,可以获得更多的操作方法。此数据集表示数据源当前行的全部字段列,ItemArray[x]是当前行全部字段列的数组对象,可以通过索引x获得任意字段值。此法的强悍之处是可以对数据源的全部字段查询。

4. DataBinder.Eval(e.Row.DataItem, "YourDataFieldName").ToString()。
    此法仍然
基于e.Row.DataItem,其特点是更快捷的获得数据源的任意字段值,因为使用了DataBinder.Eval(),需要注意的是不要写错字段名称。
5. 将e.Row.DataItem转化为自定义类型,实现数据类型化。
    例如:
    DSRequestTracking.TB_RequestTrackingRow rtrow=(DSRequestTracking.TB_RequestTrackingRow)((DataRowView)e.Row.DataItem).Row;
    RequestStatusDropDownList1.SelectedValue = rtrow.StatusID.ToString();
    其中DSRequestTracking是通过DSRequestTracking.xsd文件在工程中自定义的强类型DataSet, TB_RequestTrackingRow是VS自动为此强类型生成的创建数据行对象的方法。通过此法,实现了类型化数据的广泛应用。数据类型化的好处很多,显而易见的便是传一个类型数据给方法,取代一大堆参数,另外就是再也不会发生字段名拼写错误的情况。

RowDataBound事件是gridview绑定数据源时,可以自定每列的样式,背景颜色,绑定需要格式化的数据,进行绑定的判断。

常用的有:

//设置鼠标经过第一行的背景颜色

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                e.Row.Attributes.Add("onmouseover", "c=this.style.backgroundColor;this.style.backgroundColor='#f2ffe3'");    

         
                e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=c");                           
                e.Row.Attributes["style"] = "Cursor:hand";
            }

        } 

//对数据源上的数据进行格式化

 


if (e.Row.RowType == DataControlRowType.DataRow)
{
switch (e.Row.Cells[3].Text.Trim())
{
case "0":
e.Row.Cells[3].Text = "跟单员";
break;
case "1":
e.Row.Cells[3].Text = "采购员";
break;
}

3.假如有这样一个判断,一个“审核”状态,一个“未审核”状态。在同一个gridview中,能过“审核”的,则他的操作按钮为“取消审核”,”未审核“ 数据的操作按钮为“通过审核”。这样需要在绑定的时候进行判断。
前台页面

<asp:TemplateField HeaderText="操作">
    <ItemTemplate>

<asp:Button runat="server" visibile=false text="操作" />

<asp:Button runat="server" visibile="false: text="操作" />

</ItemTemplate>

</asp:TemplateField>
后台代码:

   protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)

{

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

       //数据源读取数据为1的为“通过审核”0“未审核”

        if(DataBinder.Eval(e.Row.DataItem, "YourDataFieldName").ToString()=="1")

{

   Button bt=e.row[

}

}

}

3.2.3 GridView.RowEditing 事件

此事件发生在单击某一行的“编辑”按钮以后, GridView 控件进入编辑模式之前

 

(此事件可以处理在点击“编辑”之后,在进行“更新”“取消”操作之前可以干一些活,例如,在进行编辑时,要求某一列上的编辑功能,注册一些脚本,事填加一些,编辑时的特效功能。例如,编辑某一列,时加入“js时间控件”,

protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
        {

            //这两行是最常用的。
            GridView1.EditIndex = e.NewEditIndex;
            Bind();

   //这里是不常用的,这是例用了My97DatePicker这个JS控件,使某一列的编辑文本,出现时间控件。              

           TextBox tb = (TextBox)GridView1.Rows[e.NewEditIndex].FindControl("TextBox1");
            ViewState["vdtime"] = tb.Text;           
            tb.Attributes.Add("onclick","WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})") ;
        }

(注:在进行编辑时,一般的都是编辑某一行的数据,如果只想编辑某一行某一列的值,就把其它列设置成“readonly”只读型,就可以了,一般适应,<asp:buttonFiled>这个,便不适合模板)

3.2.4 GridView.RowCancelingEdit 事件

单击编辑模式中某一行的“取消”按钮以后,在该行退出编辑模式之前发生

(注:

单击编辑模式中某一行的“取消”按钮以后,将引发 RowCancelingEdit 事件,但在该行退出编辑模式之前。允许您提供以下事件处理方法,即只要发生此事件就执行一个自定义例程,如:如果取消操作将行置于不希望有的状态,则停止该操作。

GridViewCancelEditEventArgs 对象将被传递给事件处理方法,以便您可以确定当前行的索引,还可以指示应停止取消操作。若要停止取消操作,请将 GridViewCancelEditEventArgs 对象的 Cancel 属性设置为 true。)

例:

        protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {//经常用的
            GridView1.EditIndex = -1;
            Bind();
        }

3.2.5GridView.RowUpdating 事件

发生在单击某一行的“更新”按钮以后, GridView 控件对该行进行更新之前

例:

前台页面

<asp:TemplateField HeaderText="充值时间">
                                  <EditItemTemplate>
                                      <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("cztime", "{0:yyyy-MM-dd HH:mm:ss}") %>'></asp:TextBox>
                                  </EditItemTemplate>
                                  <ItemStyle Width="120px" />
                                  <ItemTemplate>
                                      <asp:Label ID="Label1" runat="server" Text='<%# Bind("cztime", "{0:yyyy-MM-dd HH:mm:ss}") %>'></asp:Label>
                                  </ItemTemplate>
                              </asp:TemplateField>

后台代码:

  protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {

//获得第4列上的文本值。
            string str = (GridView1.Rows[e.RowIndex].Cells[4].FindControl("TextBox1") as TextBox).Text; 

//获得主键值    (要设置GridView属性中的DataKeyNames="id"这个属性,ID)     
            string str1 = GridView1.DataKeys[e.RowIndex].Value.ToString();

     //更新操作
            GridView1.EditIndex = -1;
            Bind();         
        }
3.1.6 GridView.PageIndexChanging 事件

在单击某一页导航按钮时,但在 GridView 控件处理分页操作之前发生

在手动给Gridview邦定数据源时(不是前台利用DataSource控件绑定),会出现这种情况:

运行后直接显示分页的1,只有1显示正常,如果点选其它的,比如2或者4什么其它别的,提示:
GridView“XXX”激发了未处理的事件“PageIndexChanging”。 

手动分页必须有PageIndexChanging事件,添加PageIndexChanging事件,然后添加如下代码

例:

protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{

      //经常用到的。
       GridView1.PageIndex = e.NewPageIndex;
       GridView1.DataBind();
}

3.1.7GridView.RowCreated 事件

GridView 控件中创建行时发生。

RowCreated 与RowDataBound比较

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

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

你可能感兴趣的:(GridView)