C#:按钮不';不要在面板内工作

C#:按钮不';不要在面板内工作,c#,asp.net,events,webforms,C#,Asp.net,Events,Webforms,我有一个有点随机的问题,我就是不明白 我的网站有一个页面,在从下拉列表中选择一个值后,它会自动生成一个表单(一个带有确认按钮的文本框) 问题是,这个按钮没有任何作用。它似乎与我创建的方法没有联系,考虑到我在另一个页面上使用了非常相似的代码,我觉得这个方法非常奇怪,而且它工作得很好 以下是ASP.NET: <asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" runat="server"> &

我有一个有点随机的问题,我就是不明白

我的网站有一个页面,在从下拉列表中选择一个值后,它会自动生成一个表单(一个带有确认按钮的文本框)

问题是,这个按钮没有任何作用。它似乎与我创建的方法没有联系,考虑到我在另一个页面上使用了非常相似的代码,我觉得这个方法非常奇怪,而且它工作得很好

以下是ASP.NET:

<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    <asp:DropDownList ID="PossibleItems" OnSelectedIndexChanged="PossibleItems_SelectedIndexChanged" AutoPostBack="true" runat="server">
        <asp:ListItem Selected="true" Value="defaultValue">Select an item</asp:ListItem>
        <asp:ListItem Value="Purpose" Text="Purpose"></asp:ListItem>
        <asp:ListItem Value="Currency" Text="Currency"></asp:ListItem>
        <asp:ListItem Value="PaymentMethod" Text="Payment Method">    </asp:ListItem>
    </asp:DropDownList>

    <asp:GridView ID="ItemNamesList" runat="server"></asp:GridView>
    <asp:Label ID="ItemName" runat="server" Text="Label"></asp:Label>
    <asp:Panel ID="AddItemForm" runat="server">
    </asp:Panel>
</asp:Content>

选择一个项目
代码如下:

    protected void PossibleItems_SelectedIndexChanged(object sender, EventArgs e)
    {
        // Generate the form
        generateForm();
    }

    protected void generateForm()
    {
        // if the administrator wants to create a new payment method
        else if (PossibleItems.SelectedValue.Equals("PaymentMethod"))
        {
            Label pmName = new Label();
            pmName.Text = "Payment method name : ";
            TextBox pmNameTB = new TextBox();
            AddItemForm.Controls.Add(pmName);
            AddItemForm.Controls.Add(pmNameTB);
            AddItemForm.Controls.Add(new LiteralControl("<br />"));

            // IMPORTANT PART: THIS IS WHERE I CREATE THE BUTTON
            Button pmBTN = new Button();
            pmBTN.Text = "Create";
            pmBTN.Click += (sender1, EventArgs) => { addPaymentMethod(sender1, EventArgs); };
            AddItemForm.Controls.Add(pmBTN);
        }
    }


    protected void addPaymentMethod(object sender, EventArgs e)
    {
        Response.Redirect("AddChange.aspx?id=18");
    }

}
protectedvoid-PossibleItems\u SelectedIndexChanged(对象发送方,事件参数e)
{
//生成表单
generateForm();
}
受保护的void generateForm()
{
//如果管理员希望创建新的付款方式
else if(可能是Items.SelectedValue.Equals(“PaymentMethod”))
{
标签pmName=新标签();
pmName.Text=“付款方式名称:”;
TextBox pmNameTB=新建TextBox();
AddItemForm.Controls.Add(pmName);
AddItemForm.Controls.Add(pmNameTB);
AddItemForm.Controls.Add(新的LiteralControl(“
”); //重要部分:这是我创建按钮的地方 按钮pmBTN=新按钮(); pmBTN.Text=“创建”; 点击+=(发送者1,事件参数)=>{addPaymentMethod(发送者1,事件参数);}; AddItemForm.Controls.Add(pmBTN); } } 受保护的void addPaymentMethod(对象发送方,事件参数e) { 重定向(“AddChange.aspx?id=18”); } }
我试着尽可能多地去除绒毛


感谢您抽出时间。

动态添加的控件和事件处理程序不会在回发过程中保留。解决问题的最简单方法是使用Visible=“False”将表单添加到.aspx中,并根据需要显示/隐藏它。>动态添加的控件和事件处理程序不会在回发过程中保留。你这是什么意思?考虑到我已经用OnRowDataBound触发器将其他按钮动态添加到GridView中,这听起来很奇怪,它工作得很好。这里的按钮有什么不同?您正在使用
.controls添加控件。添加
这也是您使用GridView所做的吗?我想不是,事实上我是。这是GridView其他按钮的代码,如果您感兴趣的话:Yikes,您真的想重新思考您的设计。你写这篇文章就像是在写Windows窗体一样。不是。这是Web表单-与其动态添加控件,不如控制控件的可见性。最好在ASPX标记中声明性地设置事件处理程序,而不是动态地分配它们。