Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通用事件处理程序不从动态按钮触发_C#_Asp.net_Webforms - Fatal编程技术网

C# 通用事件处理程序不从动态按钮触发

C# 通用事件处理程序不从动态按钮触发,c#,asp.net,webforms,C#,Asp.net,Webforms,我有一堆动态创建的按钮,并将其单击事件设置为事件处理程序…当我运行它时,它们处理程序从不触发,我已经完成了代码,似乎没有什么异常,但它就是不会触发 下面是创建按钮的代码片段 for (cellCtr = 1; cellCtr <= 9; cellCtr++) { Button button = new Button(); HyperLink link = new HyperLink();

我有一堆动态创建的按钮,并将其单击事件设置为事件处理程序…当我运行它时,它们处理程序从不触发,我已经完成了代码,似乎没有什么异常,但它就是不会触发

下面是创建按钮的代码片段

for (cellCtr = 1; cellCtr <= 9; cellCtr++)
            {

                Button button = new Button();

                HyperLink link = new HyperLink();

                TableCell tCell = new TableCell();

                if (rowCtr == rN)
                    break;

                string myStr = daccess.dsSubjects.Tables[0].Rows[rowCtr]["SubjectName"].ToString();
                int myID = Convert.ToInt32(daccess.dsSubjects.Tables[0].Rows[rowCtr]["SubjectID"].ToString());

                button.ID = Convert.ToString(myID);
                button.Text = myStr;

                button.CssClass = "btn btn-primary btn-sm"; 

                button.Click += ButtonSubjectClick;

                tCell.Controls.Add(button);

                tRow.Cells.Add(tCell);
                rowCtr++;

                if (cellCtr == rN)
                {
                    rowCtr = rowCtr - 1;
                    break;
                }
            }
当它运行时,源代码如下所示

<input type="submit" name="38" value="Math" id="38" class="btn btn-primary btn-sm" />

此代码适用于我:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        // do something if needed
    }

    // outside of postback, you need to add it each time
    Button button = new Button();
    button.ID = "btn1";
    button.Text = "clicky me";
    button.Click += new EventHandler(ButtonSubjectClick);
    pnl.Controls.Add(button);
}

void ButtonSubjectClick(object sender, EventArgs e)
{
    Button button = (Button)sender;
    button.Text = "clicked me";
}
我相信这是一个关于如何将按钮添加到页面的问题。我在每次回发时都会添加我的按钮,因此服务器会对其进行注册

如果要在其他事件中添加按钮,则可以使用viewstate或会话变量,存储某种标志来创建按钮,然后在每次回发中检查该标志

编辑,为了清晰起见,pnl是我页面上的一个面板:

<form id="form1" runat="server">
<div>
    <asp:Panel ID="pnl" runat="server"></asp:Panel>
</div>
</form>


是否尝试将
按钮对象单击
设置为静态方法?我是根据MSDN的样品做的,我自己还没试过。我不确定,我想我没有试过。我以前遇到过这个问题,我找到了答案,但我不知道我做了什么来解决它。我在点击按钮时创建了这些按钮。也就是说,我有6个按钮,每个按钮在点击时,都会根据我的数据库中的值生成相应的按钮,当点击任何一个动态按钮时,它应该运行其处理程序来删除该记录是的,但您必须确保在每次页面加载时将这些按钮添加到控制树中,包括点击这些动态按钮的时间。(回复OP,Hardrada是正确的)这将不起作用,因为按钮在页面生命周期中生成得太晚,因此当您单击一个按钮时,服务器不知道该按钮,并且忽略其单击事件。最好的解决办法是,正如我在帖子中指出的那样;在原始按钮上,单击生成会话变量,即会话[“createBtn1”]=“是”;然后在页面中询问自己是否(会话[“createBtn1”]!=null),然后创建此按钮。
<form id="form1" runat="server">
<div>
    <asp:Panel ID="pnl" runat="server"></asp:Panel>
</div>
</form>