热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GridView的RowCommand事件中取得行索引

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


后台

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

            Response.Write(tt);
        }

    }


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

    }




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

同时我们注意到&#xff0c;如果使用默认的CommandField&#xff0c;


<asp:CommandField ShowDeleteButton&#61;"True" ShowEditButton&#61;"True" />


则可以在RowCommand中使用如下代码取出行号&#xff1a;


protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)

    {

        //编辑按扭

        if (e.CommandName &#61;&#61; "Edit")

        {

            //设置编辑行高亮显示

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

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

            int index &#61; Convert.ToInt32(e.CommandArgument);

            GridViewRow row &#61; GridView1.Rows[index];

            string xh3 &#61; row.Cells[3].Text;

}

}



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






                    

                        LinkButton1" runat&#61;"server" CausesValidation&#61;"True" CommandName&#61;"Update"

                            Text&#61;"更新">

                        
                            Text&#61;"取消">

                    


                    

                        LinkButton1" runat&#61;"server" CausesValidation&#61;"False" CommandName&#61;"Edit"

                            Text&#61;"编辑" OnClientClick&#61;"return confirm(&#39;确认要编辑吗&#xff1f;&#39;);">

                        
                            Text&#61;"选择">

                        
                            Text&#61;"删除" OnClientClick&#61;"return confirm(&#39;确认要删除吗&#xff1f;&#39;);">asp:LinkButton>

                    


                


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

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

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

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


/// 

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

    /// 


    /// 

    /// 

    protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)

    {

        if (e.Row.RowType &#61;&#61; DataControlRowType.DataRow)

        {

            // Retrieve the LinkButton control from the first column.

            LinkButton LinkButton1 &#61; (LinkButton)e.Row.FindControl("LinkButton1");

            // Set the LinkButton&#39;s CommandArgument property with the row&#39;s index.

            LinkButton1.CommandArgument &#61; e.Row.RowIndex.ToString();

        }

    }

 
推荐阅读
author-avatar
手机用户彡2570437895
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有