我对此做了一些研究,但我发现的解决方案似乎都没有解决我的问题。我在C#中有一个asp.net Web应用程序,我想在从下拉列表中选择后动态添加提交按钮。
protected void Page_Load(object sender, EventArgs e)
{
submitButton.Text = "Submit";
submitButton.ID = "submitButton";
submitButton.Click += new EventHandler(submitButton_Click);
SelectionDropDownList.SelectedIndexChanged += new EventHandler(SelectionDropDownList_SelectedIndexChanged);
}
protected void SelectionDropDownList_SelectedIndexChanged(object sender, EventArgs e)
{
switch (SelectionDropDownList.SelectedIndex)
{
case 1:
//does a redirect
break;
case 2:
Panel1.Controls.Add(submitButton);
break;
case 3:
//does a redirect
break;
}
}
protected void submitButton_Click(object sender, EventArgs e)
{
//can't get this event to fire.
SubmitSearch();
}
答案 0 :(得分:7)
这是一个时间问题。你的程序流程是这样的:
这是Webforms的一个令人讨厌的细节,也是不使用它的好理由 - 如果你可以自由选择的话。如果必须使用它,http://msdn.microsoft.com/en-us/library/ms178472.aspx可能会有所帮助。
答案 1 :(得分:3)
如何而不是动态添加控件,始终添加它,但最初设置Visible=false
。那么你当前正在添加它,而只是让它可见?
动态控件在webforms中总是有点棘手。
答案 2 :(得分:0)
从您发布的示例中,它看起来不像按钮是动态的;看起来你只是动态地分配事件处理程序。如果是这种情况,则每次页面回发时都不需要重新分配事件处理程序。就此而言,如果ID已在标记中定义,则不应重新分配ID。
试试这个:
if (!Page.IsPostBack)
{
Button1.Click += new EventHandler(Button1_Click);
}
修改强>
从代码的外观来看,处理您的情况的正确方法是将控件放在面板中,并在下拉列表的选定索引发生变化时切换面板的可见性。
protected void DropDown1_SelectedIndexChanged(object sender, EventArgs e)
{
Panel1.Visible = SomeIntValue == 2;
}
根据您当前的代码:
如果我在标记中创建一个按钮,如下所示:
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" ...>
在后面的代码中,我尝试将控件移动到另一个面板,如下所示:
SomePanel.Controls.Add(Button1);
这不是做你想要做的事情的正确方法,但技术上说出ID(在服务器上)并且事件处理程序将保持不变,无论你在哪里移动控制权。
答案 3 :(得分:0)
尝试在案例2中创建一个按钮。
答案 4 :(得分:0)
如果您在WebForms中动态创建控件,则必须在每次回发时以及加载ViewState之前重新创建它们。否则你最终会破坏/破坏ViewState。此外,我认为最近需要在Page.OnLoad(EventArgs e)中附加事件,以便他们解雇。