簡體   English   中英

動態創建的按鈕單擊事件未觸發

[英]dynamically created button click event not firing

我對此進行了一些研究,但是發現的解決方案似乎都無法解決我的問題。 我在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();
}

這是一個時間問題。 您的程序流程如下:

  • Page_Load被執行,頁面被渲染。
  • 選擇下拉菜單。 回發到服務器。 Page_Load被執行。 然后,事件將發送到您的下拉實例。 SelectedIndexChanged被執行。 您的按鈕已創建,頁面已呈現並發送給客戶端。
  • 按下按鈕。 回發到服務器。 Page_Load被執行。 ASP嘗試執行該事件,但是該按鈕不再存在。 因此該事件被忽略。

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

總是動態添加控件,而不是動態添加控件,而是先設置Visible=false 然后,您當前在何處添加它,而不是使其可見?

動態控件在Web窗體中總是有些棘手。

在您發布的示例中,按鈕看起來不是動態的; 看起來您只是在動態分配事件處理程序。 如果是這種情況,則無需在頁面每次回發時都重新分配事件處理程序。 因此,如果該ID已在標記中定義,則您也不應重新分配該ID。

嘗試這個:

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(在服務器上)和事件處理程序都將保持不變。

嘗試在情況2中創建一個按鈕。

如果要在WebForms中動態創建控件,則必須始終在每次回發時以及在加載ViewState之前重新創建它們。 否則,您將導致ViewState損壞/損壞。 另外,我認為事件必須最遲在Page.OnLoad(EventArgs e)中附加,以使其觸發。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM