2010-01-12 106 views
3

我有一個用戶控件,當單擊按鈕時需要加載子控件。 麻煩的是它必須從另一個類請求控制。以編程方式在ASP.NET中添加用戶控件

所以在按鈕單擊事件,我調用該函數得到了我的控制,並把它添加到頁面,如下所示:

UserControl ctrl = ExampleDataProvider.GetControl(some params...); 
myDetailPane.Controls.Add(ctrl); 

的getControl方法訪問的樣子:

public static UserControl GetControl(some params...) 
     { 
      ExampleDetailPane ctrl = new ExampleDetailPane(); 
      ctrl.Value = "12"; 
      ctrl.Comment = string.Empty; 
      return ctrl; 
     } 

由於頁面的生命週期,這不起作用 - 子控件的Page_Load被觸發並且其控件爲空。

我知道我的方法是錯誤的,爲什麼,但不知道最好的解決方法!誰能幫忙?

+2

動態控件必須在每次回發時重新創建,這是關於如何保持動態控件及其狀態的好鏈接。 http://www.singingeels.com/Articles/Dynamically_Created_Controls_in_ASPNET.aspx – 2010-01-12 15:43:18

+0

@Richard,+1,因爲這是使這項工作的唯一方法。你應該做出這個答案而不是評論。 – 2010-01-12 15:46:04

回答

7

動態控件必須重新創建,這Article是關於如何堅持動態控件和他們的狀態了良好的聯繫。

+0

鏈接已損壞 – Toolkit 2016-08-03 22:23:40

1

兩種可能的方法:

  1. 已經在頁面的控制,但沒有裝載任何東西,直到他們點擊了按鈕。然後,您可以在控件中填充值。這有利於頁面生命週期。請注意,您始終可以使用用戶控件所在的「display:none」樣式設置。然後,作爲OnClick for按鈕的一部分,您可以顯示使您的控件可見的div。
  2. 您可以彈出另一個窗口,但顯然這有可能被彈出窗口攔截器阻止。
1

如果你想在PostBack中訪問你的控件或者你想綁定Event,你必須在CreateChildControls()方法中創建它們。在每個回發

private UserControl _uc = null; 

/// <summary> 
    /// Creates all controls. 
    /// </summary> 
    /// <remarks>All the controls must be created in this method for the event handler</remarks> 
    protected override void CreateChildControls() 
    { 
     _uc = new UserControl(); 

     this.Controls.Add(_uc); 
     base.CreateChildControls(); 
    } 
2

Page_Init中創建您的控件。然後將其顯示在您的Button_Click事件中。


(CTRL + C/Ctrl + V從一些其他的問題,我上星期回答):即必須保持頁面週期之間

一切都應該在Page_Init,不Page_Load聲明。

所有初始化,如添加事件處理程序和添加控件都應該在初始化時添加,因爲狀態在頁面循環之間保存。處理控件的內容和視圖狀態應在Load中完成。

還請檢查http://msdn.microsoft.com/en-us/library/ms178472.aspx

初始化

畢竟控件都已初始化且已應用所有外觀 設置引發。使用此 事件來讀取或初始化控件 屬性。

負載

頁調用頁面上OnLoad事件方法 ,然後遞歸確實的 相同爲每個子控制,其 做同樣對於其每個子的 控制,直到頁面和所有 控件被加載。

使用OnLoad事件方法在控件中設置 屬性並建立 數據庫連接。

相關問題