1

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

我相信问题是我在用户单击“提交”按钮后创建按钮。如果我在 page_load 中创建按钮,那么 RowCommand 可以工作。

这是网站应该如何流动:

  1. 页面加载:显示基本数据。
  2. 用户单击创建一个 的提交按钮,该按钮GridView具有一个ButtonField。theGridViewButtonFieldget 都是在后端动态创建的。
  3. 用户然后单击生成的按钮,它应该触发RowCommand

这是代码:

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

生成 Gridview 和按钮

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>
4

2 回答 2

3

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

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

gv1.RowCommand += new GridViewCommandEventHandler(CustomersGridView_RowCommand); 

当您从视图状态重新加载页面时不会重新执行,当您单击网格中的一个按钮并且浏览器将页面发布回服务器时必须这样做。

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

于 2012-06-21T18:42:54.917 回答
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,而不是等到我到达 button_click 事件。如果是,那么我知道用户希望我加载数据并显示它。目前在上面的代码中,我只是在同一个函数中制作和显示数据(这是一个糟糕的设计,但我只是简单地进行原型设计)。

然后,每当用户单击任何会导致回发的内容时,它都会将表格添加到控件中。然后控件可以触发(我不知道为什么或如何,但它有效..)

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

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

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

于 2012-06-22T18:22:51.863 回答