none
GridView 的 RowCommand事件 RRS feed

  • 问题

  • 最近一直纠结于RowCommand事件,书上说是响应GridView中的Button 我知道包括模板列的Button,但是!
    昨天有个问题困扰至今,就是 有个模板列中的Button "Button1"  其CommandName是我自定义的"borrow"
    然后再RowCommand事件中写代码,通过e.CommandName 判断是该命令,然后执行想关操作,但是通过
    int index=convert.toInt32(e.CommandArgument)获取不到行索引!后来尝试GridView自己的ButtonField 的Button却可以!
    有点晕了,请教一下,我还没懂这个事件!


     另外想实现个问题,就是关于上面的Button 
    GridView最后一列有个Button 是用来续借图书的 点击后,就在该单元显示  续借成功!或者  续借失败!  注:此时Button已经没有了。 
    2009年12月5日 12:19

答案


  • 你好,

    你所说的在template模板中的button不行的问题,我已经用下面测试过了,是可以的。你参考下面代码试试。
    <%@ Page Language="C#" %>
    
    <%@ Import Namespace="System" %>
    <%@ Import Namespace="System.Configuration" %>
    <%@ Import Namespace="System.Data" %>
    <%@ Import Namespace="System.Linq" %>
    <%@ Import Namespace="System.Web" %>
    <%@ Import Namespace="System.Web.Security" %>
    <%@ Import Namespace="System.Web.UI" %>
    <%@ Import Namespace="System.Web.UI.HtmlControls" %>
    <%@ Import Namespace="System.Web.UI.WebControls" %>
    <%@ Import Namespace="System.Web.UI.WebControls.WebParts" %>
    <%@ Import Namespace="System.Web.Services" %>
    <%@ Import Namespace="System.ComponentModel" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
        public DataTable GenerateDT
        {
            get
            {
                if (ViewState["ds"] != null)
                {
                    return (ViewState["ds"] as DataSet).Tables[0];
    
                }
                else
                {
                    DataTable dt = new DataTable();
                    dt.Columns.Add("Id", typeof(int));
                    dt.Columns.Add("Test1", typeof(string));
                    dt.Columns.Add("Test2", typeof(string));
                    dt.Columns.Add("Test3", typeof(string));
                    dt.Columns.Add("UserName", typeof(string));
                    dt.Columns.Add("Password", typeof(string));
                    dt.Columns.Add("Bool", typeof(System.Boolean));
                    dt.PrimaryKey = new DataColumn[] { dt.Columns[0] };
                    DataRow dr1 = dt.NewRow();
                    dr1[0] = "1";
                    dr1[1] = "red";
                    dr1[2] = "test3";
                    dr1[3] = "test3";
                    dr1[4] = "Name1";
                    dr1[5] = "";
                    dr1[6] = true;
                    dt.Rows.Add(dr1);
                    DataRow dr2 = dt.NewRow();
                    dr2[0] = "2";
                    dr2[1] = "blue";
                    dr2[2] = "test3";
                    dr2[3] = "test3";
                    dr2[4] = "Name2";
                    dr2[5] = "2";
                    dr2[6] = true;
                    dt.Rows.Add(dr2);
                    DataRow dr3 = dt.NewRow();
                    dr3[0] = "3";
                    dr3[1] = "yellow";
                    dr3[2] = "test3";
                    dr3[3] = "test3";
                    dr3[4] = "Name2";
                    dr3[5] = "";
                    dr3[6] = true;
                    dt.Rows.Add(dr3);
                    DataSet ds = new DataSet();
                    ds.Tables.Add(dt);
                    ViewState["ds"] = ds;
                    return dt;
    
                }
            }
            set { ViewState["ds"] = value; }
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!this.IsPostBack)
            {
                this.GridView1.DataSource = this.GenerateDT;
                this.GridView1.DataBind();
               
            }
    
        }
    
        protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "Test")
            {
                this.TextBox1.Text = "test";
            }
        } 
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GridView1" runat="server" AllowSorting="True" AllowPaging="True"
                PageSize="3" AutoGenerateSelectButton="True" ShowFooter="True" OnRowCommand="GridView1_RowCommand">
                <Columns>
                    <asp:CommandField ShowEditButton="True" />
                    <asp:TemplateField HeaderText="Index">
                        <ItemTemplate>
                            <%#((GridViewRow)(Container)).RowIndex %>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField ShowHeader="False">
                        <ItemTemplate>
                            <asp:Button ID="Button1" runat="server" CausesValidation="false" 
                                CommandName="Test" Text="Button" />
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:Button ID="Button3" runat="server" Text="Button" />
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
                <SelectedRowStyle BackColor="LightCyan" ForeColor="DarkBlue" Font-Bold="true" />
            </asp:GridView>
            
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        </div>
        </form>
    </body>
    </html>
    

    Microsoft Online Community Support
    2009年12月7日 5:16

全部回复

  •     protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
            {
                if (e.CommandName == "borrow")
                {
                .....处理 
                }
            }
    或者用Button的command事件也行
    不太明白你的意思
    2009年12月5日 14:38
  • 你好!

    请参考下面的地址:


    知识改变命运,奋斗成就人生!
    2009年12月7日 1:12
    版主
  • 你好,int index=convert.toInt32(e.CommandArgument)获取不到行索引中的CommandArgument是要自己赋值后才能获取。

    例如:CommandArgument='<%# Eval("ProductName") %>'
    2009年12月7日 1:42
    版主
  • 1.首先你检查下你的按钮CommandArgument是否与数据库的字段进行了绑定,
    2.如果绑定无误的话,就可以在
            void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
            {
                if (e.CommandName == "borrow")
                {
                
                    int index=convert.toInt32(e.CommandArgument)
                }
            }

    努力+方法=成功
    2009年12月7日 2:12
  • 我的Button按钮是固定的操作  只需要设置Text值,不需要绑定数据库的字段的。现在的问题就是我用ButtonField的按钮可以获取索引,用模板列的Button就不行。

    2009年12月7日 2:35
  • 你好!我的Button按钮是固定的操作  只需要设置Text值,不需要绑定数据库的字段的。现在的问题就是我用ButtonField的按钮可以获取索引,用模板列的Button就不行。
    2009年12月7日 2:35

  • 你好,

    你所说的在template模板中的button不行的问题,我已经用下面测试过了,是可以的。你参考下面代码试试。
    <%@ Page Language="C#" %>
    
    <%@ Import Namespace="System" %>
    <%@ Import Namespace="System.Configuration" %>
    <%@ Import Namespace="System.Data" %>
    <%@ Import Namespace="System.Linq" %>
    <%@ Import Namespace="System.Web" %>
    <%@ Import Namespace="System.Web.Security" %>
    <%@ Import Namespace="System.Web.UI" %>
    <%@ Import Namespace="System.Web.UI.HtmlControls" %>
    <%@ Import Namespace="System.Web.UI.WebControls" %>
    <%@ Import Namespace="System.Web.UI.WebControls.WebParts" %>
    <%@ Import Namespace="System.Web.Services" %>
    <%@ Import Namespace="System.ComponentModel" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
        public DataTable GenerateDT
        {
            get
            {
                if (ViewState["ds"] != null)
                {
                    return (ViewState["ds"] as DataSet).Tables[0];
    
                }
                else
                {
                    DataTable dt = new DataTable();
                    dt.Columns.Add("Id", typeof(int));
                    dt.Columns.Add("Test1", typeof(string));
                    dt.Columns.Add("Test2", typeof(string));
                    dt.Columns.Add("Test3", typeof(string));
                    dt.Columns.Add("UserName", typeof(string));
                    dt.Columns.Add("Password", typeof(string));
                    dt.Columns.Add("Bool", typeof(System.Boolean));
                    dt.PrimaryKey = new DataColumn[] { dt.Columns[0] };
                    DataRow dr1 = dt.NewRow();
                    dr1[0] = "1";
                    dr1[1] = "red";
                    dr1[2] = "test3";
                    dr1[3] = "test3";
                    dr1[4] = "Name1";
                    dr1[5] = "";
                    dr1[6] = true;
                    dt.Rows.Add(dr1);
                    DataRow dr2 = dt.NewRow();
                    dr2[0] = "2";
                    dr2[1] = "blue";
                    dr2[2] = "test3";
                    dr2[3] = "test3";
                    dr2[4] = "Name2";
                    dr2[5] = "2";
                    dr2[6] = true;
                    dt.Rows.Add(dr2);
                    DataRow dr3 = dt.NewRow();
                    dr3[0] = "3";
                    dr3[1] = "yellow";
                    dr3[2] = "test3";
                    dr3[3] = "test3";
                    dr3[4] = "Name2";
                    dr3[5] = "";
                    dr3[6] = true;
                    dt.Rows.Add(dr3);
                    DataSet ds = new DataSet();
                    ds.Tables.Add(dt);
                    ViewState["ds"] = ds;
                    return dt;
    
                }
            }
            set { ViewState["ds"] = value; }
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!this.IsPostBack)
            {
                this.GridView1.DataSource = this.GenerateDT;
                this.GridView1.DataBind();
               
            }
    
        }
    
        protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "Test")
            {
                this.TextBox1.Text = "test";
            }
        } 
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GridView1" runat="server" AllowSorting="True" AllowPaging="True"
                PageSize="3" AutoGenerateSelectButton="True" ShowFooter="True" OnRowCommand="GridView1_RowCommand">
                <Columns>
                    <asp:CommandField ShowEditButton="True" />
                    <asp:TemplateField HeaderText="Index">
                        <ItemTemplate>
                            <%#((GridViewRow)(Container)).RowIndex %>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField ShowHeader="False">
                        <ItemTemplate>
                            <asp:Button ID="Button1" runat="server" CausesValidation="false" 
                                CommandName="Test" Text="Button" />
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:Button ID="Button3" runat="server" Text="Button" />
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
                <SelectedRowStyle BackColor="LightCyan" ForeColor="DarkBlue" Font-Bold="true" />
            </asp:GridView>
            
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        </div>
        </form>
    </body>
    </html>
    

    Microsoft Online Community Support
    2009年12月7日 5:16
  • 你好!我的Button按钮是固定的操作  只需要设置Text值,不需要绑定数据库的字段的。现在的问题就是我用ButtonField的按钮可以获取索引,用模板列的Button就不行。

      protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
            {
                if (e.CommandName == "borrow")
                {
                    Button  b = e.CommandSource as Button;
                    Response.Write(b.Text);
                }
            }
    2009年12月7日 7:37
  • 谢谢,从你的文章学到不少。
    2009年12月8日 2:17