2014-02-07 54 views
2

是否可以實現自定義UserControlControl,它將像PlaceHolder那樣工作,但是使用我的邏輯?使用的實例:訪問UserControl的模板項目

<x:MyControl runat="server"> 
    <Template> 
     <asp:TextBox runat="server" ID="MyTextBox" /> 
     ..... any custom code here ........ 
    </Template> 
</x:MyControl> 

然後在後臺代碼:

MyTextBox.Text = "ABC"; 

我實現了試驗控制,但我無法訪問頁面嵌套層次ASP控制。錯誤是The name "MyTextBox" does not exist in the current context

+0

@JohnSaunders哼哼,這是不正確的。 –

回答

1

必須調用函數「的FindControl」在你的用戶控件MyControl。 將您的MyControl命名爲id="mcContainer",然後在您的代碼後面調用((TextBox)mcContainer.FindControl("MyTextBox")).Text = "ABC";

這個維基這裏How to: Create Templated ASP.NET User Controls

爲什麼我可以寫MyTextBox.Text="ABC"當它是在頁面,當文本框命名用戶控件實現容器內,爲什麼不說可能嗎?

那麼,當你拖動N放置你的文本框時,ASP.NET頁面設計器在你的頁面的部分類中爲你自己保留的部分類中爲你聲明瞭一個變量,就是你的類的設計器部分,你的頁面被聲明。

所以當你拖放你的用戶控件,並在它的命名容器中創建一個文本框時,你不能直接訪問它,因爲你的頁面沒有對該控件的引用,原因是因爲該控件僅在用戶控件本身的實例期間在運行時纔可用,其動機部分與ASP.NET頁面解析器呈現控件的方式有關。

引用此舉resource: 使用組合控件時,熟悉一些屬性和方法以及INamingContainer接口很重要。所有組合控件都應該實現INamingContainer接口。實現此接口的控件不需要添加任何方法或屬性;相反,實現的接口僅僅表示該控件正在用作複合控件。其效果是,子控件(即組合控件的Controls集合中的控件)被呈現,以便它們的ID以控件的命名容器的ID作爲前綴。這可確保所有子控件都具有唯一的ID值,即使在窗體上存在多個父控件實例。 WebControl類具有返回控件的父級的NamingContainer屬性。

所以,當你寫MyTextBox,你的文本框的名字應該至少像$ mcContainer $ MyTextBox。因此,沒有辦法透明地做你想做的事情。

+0

好吧,忘了'UserControl'。是否有可能重塑'PlaceHolder'的功能? (一切工作,即使沒有'模板'那裏)。 – Denis

+0

那是怎麼回事?重塑,你能詳細點嗎? –

+0

我不知道這一點。謝謝。 –

0

解決方案。

這樣創建類:

public class ToolTip : PlaceHolder 
{ 
    protected override void CreateChildControls() 
    { 
     HtmlGenericControl div1 = new HtmlGenericControl("div"); 
     div1.Attributes.Add("id", ClientID); 
     div1.Attributes.Add("class", "tooltip"); 
     while (Controls.Count != 0) 
      div1.Controls.Add(Controls[0]); 
     Controls.Add(div1); 
    } 
} 

然後在ASPX文件中像這樣註冊它:

<%@ Register Assembly="YOUR_ASSEMBLY" TagPrefix="x" Namespace="YOUR_NAMESPACE" %> 

然後使用它是這樣的:

<x:ToolTip runat="server"> 
    ... any your content here ...... 
</x:ToolTip> 

現在你能嵌套0​​中的任何控件,並將任何合成邏輯添加到CreateChildControls()