zoukankan      html  css  js  c++  java
  • GridView的RowCommand事件中取得行索引

    前台添加一模版列,里面添加一个Button
    <asp:TemplateField HeaderText="测试">
                                      
    <ItemTemplate>
                                          
    <asp:Button ID="Button1" CommandName="btn" runat="server" Style="position: relative" Text="Button" />
                                      
    </ItemTemplate>
                                  
    </asp:TemplateField>


    后台

    protected void gv_Company_RowCommand(object sender, GridViewCommandEventArgs e)
        
    {
            
    if (e.CommandName == "btn")
            
    {
                
    int index = Convert.ToInt32(e.CommandArgument);
                DataKey key 
    = this.gv_Company.DataKeys[index];
                
    string tt = key.Value.ToString();

                Response.Write(tt);
            }

        }


        
    //行数据绑定
        protected void gv_Company_RowDataBound(object sender, GridViewRowEventArgs e)
        
    {
            
    if (e.Row.RowType == DataControlRowType.DataRow)
            
    {
                Button bt 
    = new Button();
                bt 
    = (Button)e.Row.Cells[6].FindControl("Button1");
                bt.CommandArgument 
    = e.Row.RowIndex.ToString();
            }

        }



    ASP.NET2.0中的GRIDVIEW控件真是非常奇怪,不知道MS是怎么考虑的,在GRIDVIEW里,行索引被放在了CommandArgument里面,而不是像DataGrid那样可以利用this.MyDataGrid.DataKeys[e.Item.ItemIndex].ToString()方便的取出主键值,

    同时我们注意到,如果使用默认的CommandField

    <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />

    则可以在RowCommand中使用如下代码取出行号:
    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)

        {

            //编辑按扭

            if (e.CommandName == "Edit")

            {

                //设置编辑行高亮显示

                this.GridView1.EditRowStyle.BackColor = Color.FromName("#F7CE90");

                //string index= this.GridView1.DataKeys[Convert.ToInt32(e.CommandArgument)].Value.ToString();

                int index = Convert.ToInt32(e.CommandArgument);

                GridViewRow row = GridView1.Rows[index];

                string xh3 = row.Cells[3].Text;

    }

    }

    但问题是,CommandField的可操控性是很底的,我们一般习惯于使用模版列来订制操作按钮,如下:

    <asp:TemplateField HeaderText="操作" ShowHeader="False">

                        <EditItemTemplate>

                            <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="True" CommandName="Update"

                                Text="更新"></asp:LinkButton>

                            <asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False" CommandName="Cancel"

                                Text="取消"></asp:LinkButton>

                        </EditItemTemplate>

                        <ItemTemplate>

                            <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False" CommandName="Edit"

                                Text="编辑" OnClientClick="return confirm('确认要编辑吗?');"></asp:LinkButton>

                            <asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False" CommandName="Select"

                                Text="选择"></asp:LinkButton>

                            <asp:LinkButton ID="LinkButton3" runat="server" CausesValidation="False" CommandName="Delete"

                                Text="删除" OnClientClick="return confirm('确认要删除吗?');"></asp:LinkButton>

                        </ItemTemplate>

                    </asp:TemplateField>


    随之而来,问题出现了,运行报错:输入字符串的格式不正确, Convert.ToInt32(e.CommandArgument)中e.CommandArgument转换为字符串为空。当我们把CommandField转换为模版列时,默认的CommandArgument属性丢失了!!!
    思考了两天,翻阅了网上的资料,最后在MSDN文档中发现,呈现 GridView 控件之前,必须先为该控件中的每一行创建一个 GridViewRow 对象。在创建 GridView 控件中的每一行时,将引发 RowCreated 事件。这使我们可以提供一个这样的事件处理方法,即每次发生此事件时都执行一个自定义例程(如在行中添加自定义内容,当然也可以添加e.CommandArgument属性为模版列里的LinkButton)。

    GridViewRowEventArgs 对象将被传给事件处理方法,随之我们可以访问正在创建的行的属性。若要访问行中的特定单元格,可以使用 GridViewRowEventArgs 对象的 Cells 属性。使用 RowType 属性可确定正在创建的是哪一种行类型(标题行、数据行等等)。

    好了,原来我们可以利用RowCreated事件来为模版列中LinkButton写入CommandArgument事件。

    下面的代码示例演示如何使用 RowCreated 事件将正在创建的行的索引存储在该行中所包含的 LinkButton 控件的 CommandArgument 属性中。这允许您确定在用户单击 LinkButton 控件按钮时包含该控件的行的索引。

     /// <summary>

        /// 为模版列LinkButton写入CommandArgument事件

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)

        {

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

            {

                // Retrieve the LinkButton control from the first column.

                LinkButton LinkButton1 = (LinkButton)e.Row.FindControl("LinkButton1");

                // Set the LinkButton's CommandArgument property with the row's index.

                LinkButton1.CommandArgument = e.Row.RowIndex.ToString();

            }

        }
  • 相关阅读:
    mysq 日期相减
    说说时间观与时间管理——北漂18年(71)
    ionic之切换开关
    ionic之单选框
    SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE locks在RR模式下可以看到最新的记录
    14.5.2.3 Consistent Nonlocking Reads 一致性非锁定读
    14.5.2.2 autocommit, Commit, and Rollback
    14.5.2 事务隔离级别
    对于唯一索引使用唯一条件搜索, InnoDB 只锁定找到的index record,不是它之前的区间
    mysql explain 解释
  • 原文地址:https://www.cnblogs.com/lds85930/p/1536595.html
Copyright © 2011-2022 走看看