我在Page_LoadComplete上制作动态表,我无法在Page_Load中进行,因为在事件处理过程中可以更改数据,所以在Page_LoadComplete我做了一些按钮并想要添加它们EventHandler:
protected void Page_LoadComplete(object sender, EventArgs e) {
btn.Click += new EventHandler(b_Click);
}
但它不起作用,如何将事件添加到按钮而不是在Page_Load?
简单,甚至不是动态代码:
void b_Click(object sender, EventArgs e) {
Label1.Text = "!!!";
}
protected void Page_Load(object sender, EventArgs e) {
Button1.Click += new EventHandler(b_Click);
}
Page_Load上的工作正常。
protected void Page_LoadComplete(object sender, EventArgs e) {
Button1.Click += new EventHandler(b_Click);
}
Page_LoadComplete上的什么都不做。
答案 0 :(得分:0)
问题是回发时控件不存在(因为您在运行时创建了它)。在Init中创建控件应解决此问题,并允许触发事件。如果您愿意,可以在LoadComplete中更改所有属性,但此时按钮需要存在。
答案 1 :(得分:0)
您尝试的内容永远不会有效,因为每次页面重新加载时都必须重新添加动态添加的控件。
由于您的控件填充基于表单中使用的数据,您应该将所有控件创建逻辑放在一个函数中,并在事件处理程序中,设置数据然后调用控件创建逻辑函数,而在页面加载你必须调用控件创建函数(假设你已经在调用之间保持数据),以便重新创建第一个创建的所有控件。然后,一旦他们被重新创建,他们就可以回应他们解雇的事件。
答案 2 :(得分:0)
好的,这是一个例子: 给出这个html片段:
<body>
<form id="form1" runat="server">
<div>
<asp:Button runat="server" Text="Click Me" OnClick="go_" />
</div>
</form>
</body>
public partial class WebForm1 : System.Web.UI.Page
{
public int ControlCount
{
get { return ViewState["Controls"] == null ? 0 : (int)ViewState["Controls"]; }
set { ViewState.Add("Controls", value); }
}
protected void Page_Load(object sender, EventArgs e)
{
for(int i = 0; i < ControlCount; i++)
{
Button b = new Button();
b.Click += btn_Click;
b.Text = "Hi";
form1.Controls.Add(b);
}
}
void btn_Click(object sender, EventArgs e)
{
((Button)sender).Text = "bye";
}
protected void go_(object sender, EventArgs e)
{
Button btn = new Button();
btn.Text = "Hi";
form1.Controls.Add(btn);
btn.Click += new EventHandler(btn_Click);
ControlCount++;
}
}
每次单击第一个按钮时,新的按钮将被添加到页面中,文本为“Hi”,每次单击“Hi”按钮时,THAT按钮的文本将变为“Bye”
这是有效的,因为我添加了两次控件。一旦进入主按钮的事件处理程序,我确定我需要一个新控件,然后在OnLoad中再次有一个新的空页面,但现在我知道(通过ControlCount)我添加了多少控件。 / p>