2011-05-02 49 views
2

我有一個動態創建的按鈕,正在添加到更新面板上,該面板位於usercontrol上。我有一個不可能的時間提高這個按鈕的點擊事件。基本上情況如下(簡化)。單擊usercontrol上的更新面板中的動態按鈕上的事件

我在這裏生成的動態按鈕:

protected override void OnPreRender(System.EventArgs e) 
{ 
    BuildDynamicControls(); 
    base.OnPreRender(e); 
} 

我也試着在這裏建立按鈕:

protected override void OnInit(System.EventArgs e) 
{ 
    BuildDynamicControls(); 
    base.OnInit(e); 
} 

的呼叫:

private void BuildDynamicControls(); 
{ 
    Button button = new Button(); 
    button.ID = "test"; 
    button.click += new EventHandler(dynamicButton_Click); 
    updatePanel.ContentTemplateContainer.Controls.Add(button); 
} 

和點擊事件:

在ASP.NET個

回答

0

我過於簡單的例子...已經過分簡化了。

的問題是,每一次正被產生的動態按鈕它接收一個全新的編號從按鈕發佈的ID不同回來。

謝謝大家的幫助。

0

事件處理程序被調用長的OnPreRender階段之前,讓你的按鈕不「存在」的時候,當ASP.NET試圖找出得到單擊的按鈕。

嘗試在初始階段創建動態控件。

+0

我試過OnInit,沒有骰子。 – RandomWebGuy 2011-05-02 20:48:35

+0

@Crunchy:這個控件何時被添加到頁面中? Init期間?加載?的PreRender?如果沒有足夠早地添加它,那麼它的初始階段可能仍然在頁面事件全部被觸發後發生。 – StriplingWarrior 2011-05-02 21:25:18

0

如果你看看page life cycle你會發現,在頁面的事件被加載即使和渲染之前觸發。

因此,在您的示例中,該按鈕將在負責觸發事件的階段之後創建。

爲了解決這個問題,該呼叫BuildDynamicControls()移動到頁面的Load事件處理程序。

從MSDN:

負載: Page對象調用頁面對象在onload方法,然後遞歸確實爲每個子控件一樣,直至頁面和所有控件加載。單個控件的Load事件發生在頁面的Load事件之後。 使用OnLoad事件方法來設置控件中的屬性並建立數據庫連接。

控制事件:使用這些事件來處理特定控件事件,如Button控件的Click事件或TextBox控件的TextChanged事件。

預渲染:Page對象創造所需爲了渲染頁面的所有控件,包括複合控件的子控件後引發。 (爲此,頁面對象爲每個控件和頁面調用EnsureChildControls。)

0

This article描述調試它的方法。它非常相似。

但是,我注意到您的代碼有一個問題。您的base.OnInit(e)作爲重寫方法的第一行。嘗試按如下方式切換它們。

protected override void OnInit(System.EventArgs e) 
    { 
base.OnInit(e); 
     BuildDynamicControls(); 

    } 
相關問題