2010-12-14 189 views
0

我有一個asp頁面「A」上的動態添加的控制和我創建了一個用戶控件「B」找到一個aspx頁面

當我做A.Controls.Add(B),我想創建一個元素,比如在控件「B」中定義的TableRow,通過後面的代碼隱藏。

當通過「A」的控件查看時,我似乎無法找到該表格行。

任何提示?

我確定這是一件非常簡單的事情,我很想念。

謝謝。

回答

2

您應該將可修改和可從外部訪問的控件公開爲屬性。 MSDN

但是考慮不要暴露整個控制本身,而只暴露f.e.文本框的文本屬性,因爲這可以防止無意和不可預知的行爲。 用戶控件應該封裝複雜性,應該(大部分)可重用。您使用usercontrol的控件(即頁面)提供的控件越多,它們的可重用性就越差,錯誤越多。

例如,如果您已經爲用戶名和密碼的文本框構建了帶有文本框的Login-Control,那麼提供名爲Username和Password的屬性是有意義的,而不是返回Textboxes本身。每個屬性都返回相應的Textbox-Text值。

在你的TableRow的例子中,它的目的是什麼?您應該使用有意義的名稱來公開一個屬性,以控制其可見性(如果該行包含標題,則該getter/setter將返回/設置實際的表格的可見狀態,即f.e。ShowTitle)。

如果你想訪問它的屬性,你當然需要一個對你的UserControl的引用。如果您在頁面上發現問題,則應提供源代碼。這取決於你創建的地方並添加它。通常你會在NamingContainer上找到FindControl的控件(f.e.在GridView的TemplateColumn中定義的控件的NamingContainer是GridViewRow本身)。

1

您可以使用頁面上的FindControl方法通過其ID找到特定的控件, 我不確定您是否想要找到已添加的UserControl'A'或其內部的控件,您應該能夠使用相同的方法來查找內部控件,只要您知道Id,並且如果此錶行是通過xml聲明的,則它具有runat =「server」屬性集。

希望它有幫助!

+0

的FindControl不是遞歸。你將不得不知道它被添加到哪個容器。在動態添加的環境中,他所尋找的控件可能不是他知道運行時名稱的控件。 – 2010-12-14 22:42:41

1

我喜歡使用遞歸擴展方法 - 很好地工作,無論嵌套等。你可以破解它返回一個具有特定ID的控件。

帕拉姆可以是任何的控制,包括一個網絡表單或一個用戶控件:-)

//Recursively get all the Controls within parent 
    public static IEnumerable<Control> GetAllControls(this Control parent) 
    { 
     foreach (Control control in parent.Controls) 
     { 
      yield return control; 
      foreach (Control descendant in control.GetAllControls()) 
      { 
       yield return descendant; 
      } 
     } 
    }