首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RowCommand不点火

RowCommand不点火
EN

Stack Overflow用户
提问于 2012-06-21 18:34:02
回答 2查看 3.4K关注 0票数 1

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

我相信问题是,在用户单击"Submit“按钮后,我正在创建按钮。如果我在page_load中设置了按钮,那么RowCommand就能工作。

这就是该网站的运作方式:

  1. Page :显示基本数据。
  2. 用户单击一个提交按钮,该按钮创建一个具有ButtonFieldGridView。在backend.
  3. User上动态地创建GridViewButtonField,然后单击生成的按钮,它将触发RowCommand

以下是代码:

Page_load

代码语言:javascript
复制
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和按钮。

代码语言:javascript
复制
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

我试着在第一个单元格中添加一个按钮

代码语言:javascript
复制
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

这就是需要被解雇的东西

代码语言:javascript
复制
public void CustomersGridView_RowCommand(Object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "buttonClicked")
        {
            int index = Convert.ToInt32(e.CommandArgument);
            Label1.Text = index.ToString();

        }
    }

Button1_Click

到底是什么创建了网格视图和按钮?

代码语言:javascript
复制
public void Button1_Click(object sender, EventArgs e)
    {
        randomGridView(Table1, 1);
        randomGridView(Table2, 4);
    }

那么如何让按钮触发CustomersGridView_RowCommand呢?还是不可能将动态生成的按钮链接起来?

编辑:这是ASPX页面:

代码语言:javascript
复制
        <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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-22 18:22:51

在动态创建RowCommand之后,我终于能够启动它了。这是我的解决方案,尽管我不能说这是最好的做事方法:

代码语言:javascript
复制
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



        }
    }

现在,如果单击了按钮,而不是等待到button_click事件,而是签入OnInit。如果是这样的话,我知道用户希望我加载数据并显示出来。目前,在上面的代码中,我只是在同一个函数中生成和显示数据(这是一个糟糕的设计,但我只是简单地进行了原型设计)。

然后,每当用户单击会导致回发的任何内容时,它都会将表添加到控件中。然后这些控件就可以启动了(我不知道为什么或如何,但它是工作的)

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

代码语言:javascript
复制
        public void Button1_Click(object sender, EventArgs e)
    {
        //randomGridView(Table1, 1);
        //randomGridView(Table2, 4);
        //Session.Add("doIt",true);
    }

同样,这可能不是最好的方法,但它是有效的。如果有人有更好的解决办法,请告诉我。

票数 1
EN

Stack Overflow用户

发布于 2012-06-21 18:42:54

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

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

代码语言:javascript
复制
gv1.RowCommand += new GridViewCommandEventHandler(CustomersGridView_RowCommand); 

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11144580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档