RowCommand没有开火

时间:2012-06-21 18:34:03

标签: c# asp.net gridview

我正在尝试以编程方式在ASP.NET中添加一个按钮,C#作为后端。我能够显示按钮,但当用户单击按钮时,RowCommand不会被触发。

我认为问题是我在用户点击“提交”按钮后创建按钮。如果我在page_load中创建按钮,则RowCommand可以正常工作。

这就是网站的流程:

  1. 页面加载:显示基本数据。
  2. 用户点击“提交”按钮,该按钮会创建GridView,其中包含ButtonFieldGridViewButtonField都是在后端动态创建的。
  3. 用户然后点击生成的按钮,它应该触发RowCommand
  4. 以下是代码:

    Page_load

    protected void Page_Load(object sender, EventArgs e)
        {
         //Nothing because we only want to create the button after the user
         //clicks on submit   
        }
    

    randomGridView

    生成Gridviews和按钮

    public void randomGridView(Table t, int x)
        {
    
            GridView gv1 = new GridView();
            GridView gv2 = new GridView();
            GridView gv3 = new GridView();
            GridView gv4 = new GridView();
    
            TableRow r = new TableRow();
            for (int i = 0; i < x; i++)
            {
                TableCell c = new TableCell();
                c.BorderStyle = BorderStyle.Solid;
                if (i == 0)
                {
                    c.Controls.Add(gv1);
                }
                if (i == 1)
                {
                    c.Controls.Add(gv2);
                }
                if (i == 2)
                {
                    c.Controls.Add(gv3);
                }
                if (i == 3)
                {
                    c.Controls.Add(gv4);
                }
                r.Cells.Add(c);
            }
            t.Rows.Add(r);
    
            //Where the xml gets bonded to the data grid
            XmlDataSource xds = new XmlDataSource();
    
            xds.Data = xml;
            xds.DataBind();
            xds.EnableCaching = false;
    
            gv1.DataSource = xds;
    
            ButtonField temp = new ButtonField();
            temp.ButtonType = ButtonType.Image;
            temp.ImageUrl = "~/checkdailyinventory.bmp";
            temp.CommandName = "buttonClicked";
            temp.HeaderText = " ";
            gv1.Columns.Add(temp);
    
            gv1.RowCommand += new GridViewCommandEventHandler(CustomersGridView_RowCommand);
            gv1.RowDataBound += new GridViewRowEventHandler(inventoryGridView_RowDataBound);
            gv1.DataBind();
    
            xds.Data = xml;
            xds.DataBind();
            xds.EnableCaching = false;
    
            gv2.DataSource = xds;
            gv2.DataBind();
    
    
            xds.Data = xml;
            xds.DataBind();
            xds.EnableCaching = false;
    
            gv3.DataSource = xds;
            gv3.DataBind();
    
            xds.Data = xml;
            xds.DataBind();
            xds.EnableCaching = false;
    
            gv4.DataSource = xds;
            gv4.DataBind();
        }
    

    inventoryGridView_RowDataBound

    我尝试手动添加按钮到第一个单元格

    public void inventoryGridView_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            Button temp = new Button();
            temp.CommandName = "buttonClicked";
            temp.Text = "temp button!";
            e.Row.Cells[0].Controls.Add(temp);
        }
    

    CustomersGridView_RowCommand

    这是需要解雇的问题

    public void CustomersGridView_RowCommand(Object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "buttonClicked")
            {
                int index = Convert.ToInt32(e.CommandArgument);
                Label1.Text = index.ToString();
    
            }
        }
    

    Button1_Click

    实际创建网格视图和按钮的内容

    public void Button1_Click(object sender, EventArgs e)
        {
            randomGridView(Table1, 1);
            randomGridView(Table2, 4);
        }
    

    那么如何让按钮触发CustomersGridView_RowCommand?或者是否无法链接动态生成的按钮?

    编辑:这是ASPX页面:

            <table>
                <tr>
                    <td>
                        <div id="div1" style="width: 257px; height: 500px; overflow-x: scroll; overflow-y: hidden;">
                            <asp:Table ID="Table1" runat="server">
                            </asp:Table>
                        </div>
                    </td>
                    <td>
                        <div id="div2" style="width: 500px; height: 500px; overflow: scroll;">
                            <asp:Table ID="Table2" runat="server">
                            </asp:Table>
                        </div>
                    </td>
                </tr>
            </table>
    

2 个答案:

答案 0 :(得分:3)

这不是不可能的。您需要了解当从视图状态重新加载页面时,控件树(您使用randomGridView方法补充)会自动重建,但这些动态添加的控件的事件处理程序不会自动重建。

特别是,这一行附加了事件处理程序:

gv1.RowCommand += new GridViewCommandEventHandler(CustomersGridView_RowCommand); 
当您从视图状态页面重新加载时,

不会重新执行,当您单击网格中的一个按钮并且浏览器将页面发布回服务器时,它必须执行此操作。

您的解决方案是在Load事件阶段检查页面是否有回发条件。如果Page.IsPostBack为true,则扫描控制树以获取这些动态生成的网格,并为RowCommand事件设置事件处理程序(如上面的代码)。

答案 1 :(得分:1)

我最终能够在动态创建后启动RowCommand。这是我的解决方案,虽然我不能说这是最好的做事方式:

protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

        if (IsPostBack){
            if (Request.Form[Button1.UniqueID] != null)
            {
                //Get the data from the server
                randomGridView(Table1, 1);
                randomGridView(Table2, 4);
            }
            //Just display the form here



        }
    }

现在我没有等到按钮点击事件,而是等到按钮被点击后,我会检查OnInit。如果那时我知道用户想要我加载数据并显示它。目前在上面的代码中,我只是在同一个函数中制作和显示数据(这是一个糟糕的设计,但我只是简单的原型设计)。

然后,只要用户点击任何会导致回发的内容,它就会将表格添加到控件中。然后控件可以触发(我不知道为什么或如何,但它的工作原理..)

只是为了表明我们甚至不需要按钮功能:

        public void Button1_Click(object sender, EventArgs e)
    {
        //randomGridView(Table1, 1);
        //randomGridView(Table2, 4);
        //Session.Add("doIt",true);
    }

同样,这可能不是最好的做事方式,但它确实有效。如果有人有更好的解决方案,请告诉我。