protected void Page_Load(object sender, EventArgs e)
{
Button a = new Button();
a.Width = 100;
a.Height = 100;
a.Text = "one";
a.Click += new EventHandler(test);
form1.Controls.Add(a);
}
protected void test(object sender, EventArgs e)
{
Button b = new Button();
b.Width = 100;
b.Height = 100;
b.Text = "two";
b.Click += new EventHandler(test2);
form1.Controls.Add(b );
Response.Write("aaaaaaaaaaaaaaaaaa");
}
protected void test2(object sender, EventArgs e)
{
Response.Write("bbbbbbbbbbbbbbb");
}
点击one
时显示按钮two
,但点击two
按钮时未运行test2
????
点击two
页面刷新时。
我想首先点击“一个”,然后“两个” 仅在单击按钮a后显示按钮
答案 0 :(得分:3)
试试这个:
protected void Page_Init(object sender, EventArgs e)
{
Button a = new Button();
a.Width = 100;
a.Height = 100;
a.Text = "one";
a.Click += new EventHandler(test);
form1.Controls.Add(a);
Button b = new Button();
b.Visible = false;
b.Width = 100;
b.Height = 100;
b.Text = "two";
b.Click += new EventHandler(test2);
form1.Controls.Add(b);
}
protected void test(object sender, EventArgs e)
{
b.Visible = true;
Response.Write("aaaaaaaaaaaaaaaaaa");
}
protected void test2(object sender, EventArgs e)
{
Response.Write("bbbbbbbbbbbbbbb");
}
答案 1 :(得分:2)
您必须重新创建动态控件(例如新按钮b
)并在每次回发时再次关联其事件处理程序 。因此,您需要将代码从test
移至Page_Load
。如果您只想在单击按钮a
后显示按钮,请使按钮b
不可见(简单解决方案)或在视图状态中存储一些布尔值,以触发创建b
(更多复杂的解决方案)。
答案 2 :(得分:0)
每次访问(或刷新)ASP页面时,都会重新创建对象并运行Page_Load事件。这意味着当您点击第一个按钮时,将创建第二个按钮,并且该事件将在该页面对象的实例中订阅。
下次点击按钮时,会创建一个新的页面对象,并且该页面对象中的事件从未被订阅过。
动态创建控件通常是一个坏主意,而是创建所有控件并隐藏那些您不想立即显示的控件。您还应该在页面加载中添加IsPostBack
检查,以便区分首次初始化和在回发时重新创建对象。