C# 命令不开火

C# 命令不开火,c#,asp.net,gridview,C#,Asp.net,Gridview,我试图以编程方式在ASP.NET中添加一个按钮,并将C#作为后端。我可以显示该按钮,但当用户单击该按钮时,不会触发row命令 我认为问题在于,我是在用户单击“提交”按钮后创建按钮的。如果我使页面中的按钮加载,那么row命令可以工作 以下是网站的流程: 页面加载:显示基本数据 用户单击一个提交按钮,该按钮创建一个网格视图,其中有一个按钮字段。GridView和ButtonField都是在后端动态创建的 然后,用户单击生成的按钮,它将触发row命令 代码如下: 页面加载 randomGridView

我试图以编程方式在
ASP.NET
中添加一个按钮,并将
C#
作为后端。我可以显示该按钮,但当用户单击该按钮时,不会触发row命令

我认为问题在于,我是在用户单击“提交”按钮后创建按钮的。如果我使页面中的按钮加载,那么row命令可以工作

以下是网站的流程:

  • 页面加载:显示基本数据
  • 用户单击一个提交按钮,该按钮创建一个
    网格视图
    ,其中有一个
    按钮字段
    GridView
    ButtonField
    都是在后端动态创建的
  • 然后,用户单击生成的按钮,它将触发
    row命令
  • 代码如下:

    页面加载
    randomGridView
    生成网格视图和按钮

    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();
        }
    
    CustomersGridView\u row命令
    这就是需要被解雇的原因

    public void CustomersGridView_RowCommand(Object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "buttonClicked")
            {
                int index = Convert.ToInt32(e.CommandArgument);
                Label1.Text = index.ToString();
    
            }
        }
    
    按钮1\u单击
    究竟是什么创建了GridView和按钮

    public void Button1_Click(object sender, EventArgs e)
        {
            randomGridView(Table1, 1);
            randomGridView(Table2, 4);
        }
    
    那么,如何让按钮触发
    CustomerGridView\u RowCommand
    ?还是不可能链接动态生成的按钮

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

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

    gv1.RowCommand += new GridViewCommandEventHandler(CustomersGridView_RowCommand); 
    
    当您从视图状态重新加载页面时,不会重新执行,当您单击网格中的一个按钮,浏览器将页面发回服务器时,必须执行此操作


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

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

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

    gv1.RowCommand += new GridViewCommandEventHandler(CustomersGridView_RowCommand); 
    
    当您从视图状态重新加载页面时,不会重新执行,当您单击网格中的一个按钮,浏览器将页面发回服务器时,必须执行此操作


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

    我最终能够在动态创建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
    
    
    
            }
        }
    
    现在,我不再等待按钮点击事件,而是检查按钮是否被点击。如果是,那么我知道用户希望我加载数据并显示它。目前在上面的代码中,我只是在同一个函数中生成和显示数据(这是一个糟糕的设计,但我只是简单地进行了原型设计)

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

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

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

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

    在动态创建row命令后,我终于能够让它启动了。这是我的解决方案,尽管我不能说这是最好的方式:

    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
    
    
    
            }
        }
    
    现在,我不再等待按钮点击事件,而是检查按钮是否被点击。如果是,那么我知道用户希望我加载数据并显示它。目前在上面的代码中,我只是在同一个函数中生成和显示数据(这是一个糟糕的设计,但我只是简单地进行了原型设计)

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

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

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

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

    您是否可以添加一些伪代码或链接?我只需要找出一个起点,除了你现在正在做的事情,你还需要做两件事。1.将ID值添加到在randomGridView中创建的网格中。调用FindControl时需要此ID值(步骤2)。2.在页面加载事件处理程序中,选中IsPostback。如果为true,则调用添加网格的控件的FindControl方法(这可能是页面本身?我无法从代码中判断),传递所创建网格的ID值。将返回的对象强制转换为GridView,然后使用回答中的代码添加RowCommand事件处理程序。我创建一行,然后创建多个单元格(其中包含GridView)并将它们添加到行中。出于某种原因,它说我的表在回发时没有值。每当我尝试
    GridView temp=(GridView)Table2.Rows[0].Cells[0].FindControl(“GridView 1”)您可以添加一些伪代码或链接吗?易居