2011-05-09 66 views
2

你能告訴我下面的代碼有什麼問題嗎?在c#中動態分配按鈕事件asp.net

 Panel div = new Panel(); 
     Button btn1 = new Button { Text = "Delete", CommandArgument = "argument", ID = "remove" }; 
     Button btn2 = new Button { Text = "Insert", CommandArgument = "argument2", ID = "insert" }; 

     btn1.Click += new EventHandler(btn_click); 
     btn2.Click += new EventHandler(btn_click); 

     div.Controls.Add(btn1); 
     div.Controls.Add(btn2); 

     ph_plan.Controls.Add(div); // where ph_plan is a placeholder in the user control 

protected void btn_click(object sender, EventArgs e) 
{ 
    Button btn = (Button)sender; 
    if(btn.ID == "remove") 
     // do this 
    else 
     // do that 
} 

上面的代碼恰好在用戶窗體中的按鈕單擊之後發生。它應該創建2個新的按鈕分配事件。事實上,它創建按鈕,但是當我點擊它們時,什麼都沒有發生。我猜這些事件無法註冊。我在這裏做錯了什麼?

+0

我們可以看到btn_click代碼的好處嗎? – pickypg 2011-05-09 15:53:49

+0

你能告訴我們btn_click的代碼嗎?當然是 – 2011-05-09 15:54:11

+0

。我現在正在編輯 – Shaokan 2011-05-09 15:55:02

回答

6

發生這種情況的原因是因爲Page是一個無狀態類,一旦它呈現所有內容,它就會被銷燬。因此,一旦有回傳,此信息將丟失,並且您的Page類不知道該按鈕的事件,因爲動態按鈕不是aspx文件的一部分。

您需要維護您創建的動態控件的集合,可能在會話中,以便在回發後重新創建它們。有一個it here的例子。

+0

例如這些按鈕需要在回送時重新創建,否則它們不存在,因此,事件接線也不會。確切地說, – 2011-05-09 15:57:49

+0

。儘管ASP.NET開發在創建和操作對象方面與WinForms類似,但思維過程卻非常不同,很容易忘記Web的無狀態特性。 – keyboardP 2011-05-09 16:00:00

+0

好的,謝謝:)我已經創建了按鈕後創建一個緩存,並在page_init事件中,如果發現有問題的緩存它重新創建按鈕。現在,它正在工作!再次感謝! – Shaokan 2011-05-09 16:02:01

0

如何建立在asp.net多個控制與事件:

string[] arg = new string[10]; 

protected void Page_Load(object sender, EventArgs e) 
{ 

    for (int i = 0; i < 10; i++) 
    { 
     LinkButton bb = new LinkButton(); 
     arg[i]= bb.ID = "bb" + i.ToString(); 
     bb.Text = "like"+"<br/>"; 
     Panel1.Controls.Add(bb); 
     bb.Click += new EventHandler(bb_Click); 
    } 
} 

void bb_Click(object sender, EventArgs e) 
{ 
    LinkButton btn = (LinkButton)sender; 
    for (int j = 0; j < 10; j++) 
    { 
     if (btn.ID == arg[j]) 
     { 
      btn.Text = ""; 
      btn.Text = "unlike"; 
      Response.Write(arg[j]); 
     } 
    } 
} 

這段代碼將打印已在頁面加載事件在運行時創建的每個按鈕的ID。

相關問題