我试图找出如何为我动态生成的4个按钮使用单击事件处理程序,而不在页面init或oninit中放置任何代码。我有一个按钮,一旦点击它会生成4个按钮。这4个按钮的单击事件处理程序不起作用。这是代码。有没有人想出一种方法来使用asp.net c#中的点击事件而不先将它放在page_load
中?如果我能解决这个问题,我可以在更大的场景中解决我的真正问题。:
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 4; i++)
{
Button b = new Button();
b.ID = i.ToString();
b.Text = "ClickMe";
b.Visible = true;
b.Click += new EventHandler(b_click);
PlaceHolder1.Controls.Add(b);
}
}
void b_click(object sender,EventArgs e)
{
Label1.Text = "ok";
}
答案 0 :(得分:0)
确保动态控件的ID包含不同的关键字。在我下面的例子中,我将“DYNAMIC_”添加到他们的ID中。然后像这样覆盖std::equals
:
OnPreRender()
当然,如果您的动态控件使用protected override void OnPreRender(EventArgs e)
{
if (Page.IsPostBack && !IsPostBackEventControlRegistered)
{
var controlName = this.Request.Form.AllKeys.SingleOrDefault(key => key.Contains("DYNAMIC_"));
processEventForDynamicControl(controlName);
}
base.OnPreRender(e);
}
private void processEventForDynamicControl(string controlName)
{
//Do your dynamic button click processing here
}
(可悲的是Button没有),您可以直接从doPost()
检索控件,如下所示:
__EVENTTARGET
答案 1 :(得分:0)
您想在 Page_Load 中加载控件。否则,它们不在控制树中,并且它们将无法触发 b_click 事件。
public int Counter
{
get { return (int?) ViewState["Counter"] ?? 0; }
set { ViewState["Counter"] = value; }
}
protected void Page_Load(object sender, EventArgs e)
{
var counter = Counter;
for (int i = 0; i < counter; i++)
{
Button b = new Button();
b.ID = i.ToString();
b.Text = "ClickMe";
b.Visible = true;
b.Click += b_click;
PlaceHolder1.Controls.Add(b);
}
}
protected void Button1_Click(object sender, EventArgs e)
{
Counter = 4;
for (int i = 0; i < 4; i++)
{
Button b = new Button();
b.ID = i.ToString();
b.Text = "ClickMe";
b.Visible = true;
b.Click += b_click;
PlaceHolder1.Controls.Add(b);
}
}
void b_click(object sender, EventArgs e)
{
Label1.Text = "ok";
}
注意: 如果您打算在Page_Init中加载,则需要使用Session而不是ViewState。
答案 2 :(得分:0)
基本上我让它运转起来。没有办法绕过它。除了PlaceHolder1.Controls.Add(b)之外,您还必须使用Oninit或Page_load并将b.Click + = new EventHandler(b_click)代码放在那里。还有,事件处理程序可以使用按钮正确注册。这种方法的问题是它将按钮放在网页的PlaceHolder部分的顶部,这不是我想要的。我希望能够将按钮放在网页的特定位置。那你怎么去做呢?基本上在PlaceHolder1.Controls.Add(b)之后只需使按钮不可见。然后,当您准备将按钮放在html的特定部分中时,再次调用PlaceHolder1.Controls.Add(b)并使其可见。这对我行得通。如果有人需要帮助,我可以发布一些示例代码,您可以自己测试。谢谢大家。