2011-08-23 143 views
1

我對此做了一些研究,但沒有找到任何解決方案似乎可以解決我的問題。我在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(); 
} 

回答

3

怎麼樣,而不是動態地添加控件,總是添加它,但最初設置Visible=false。那麼你現在添加它的地方,而只是使其可見?

動態控件在webforms中總是有點棘手。

+0

我有一種感覺,就是我最終會去改變可見性屬性。我希望有一種方式可以動態地工作,但似乎比必要的更令人沮喪。 – Spacemancraig

+0

我希望我可以多次提出這個答案。隱藏/顯示或啓用/禁用操作在ASP.NET中比動態控件更容易管理。 – mikemanne

7

這是一個計時問題。你的程序流程如下:

  • Page_Load被執行,頁面被渲染。
  • 選擇下拉菜單。回發發送到服務器。 Page_Load被執行。然後事件發送到您的下拉實例。 SelectedIndexChanged被執行。您的按鈕已創建,頁面已呈現併發送給客戶端。
  • 按鈕被按下。回發發送到服務器。 Page_Load被執行。 Asp試圖執行該事件,但該按鈕不再存在。所以這個事件被忽略了。

這是Webforms的令人討厭的細節之一,也是不使用它的一個很好的理由 - 如果你可以自由選擇。如果你必須使用它,http://msdn.microsoft.com/en-us/library/ms178472.aspx可能會有所幫助。

0

從您發佈的示例看,它看起來不像按鈕是動態的;它看起來像你只是動態分配事件處理程序。如果是這種情況,則每次頁面回傳時都不需要重新分配事件處理程序。對於這個問題,如果已經在標記中定義了標識,則不應該重新分配標識。

試試這個:

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(在服務器上)和事件處理程序將保持不變,無論您嘗試將控件移動到哪裏。

+0

它在我的switch語句中動態添加,並且仍然會產生相同的結果。 – Spacemancraig

+0

它不會動態添加到交換機中。它被動態地移動到面板中,但是按鈕本身不會在switch語句中動態創建,除非您省略了一些代碼。如果這就是你所有的代碼,你不應該重新分配ID或事件處理程序。 –

+0

@Spacemancraig:查看編輯答案。 –

0

嘗試在你的案例2中創建一個按鈕。

0

如果您在WebForms中動態創建控件,則始終必須在每次回發和ViewState加載之前重新創建它們。否則,最終會出現損壞的ViewState。另外,我相信最新的事件需要附加在Page.OnLoad(EventArgs e)中以供他們觸發。