2008-12-17 50 views
3

我想實現谷歌無法給出答案。我試圖創建一個asp.net用戶控件,當我將內容放入它的開放關閉標記中時,它會讓我仍然能夠通過來自Parent的ID訪問它的內容。這是我想要實現的例子。ASP.NET:可能創建一個包含內部標記內容的UserControl?

用戶控件:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ctrlGENE_CollapsiblePanel.ascx.cs" 
    Inherits="Controls_GenericsControls_ctrlGENE_CollapsiblePanel" %> 
<asp:Panel ID="pnlHeader" CssClass="SnapPanelHeader" runat="server"> 
    <h3> 
     <asp:Literal ID="litTitle" Text='<%# Text %>' runat="server" /> 
    </h3> 
    <div class="SnapPanelHeader-img"> 
     <img id="imgOpenClose" src="/images/application/close.jpg" alt="" /> 
    </div> 
</asp:Panel> 
<asp:PlaceHolder runat="server" ID="pnlContent"> 
// **HERE I WANT TO INCLUDE THE INSIDE MARKUP** 
</asp:PlaceHolder> 
<act:CollapsiblePanelExtender runat="server" TargetControlID="pnlContent" ImageControlID="imgOpenClose" 
    ExpandControlID="imgOpenClose" CollapseControlID="imgOpenClose" CollapsedImage="/images/application/open.jpg" 
    ExpandedImage="/images/application/close.jpg" CollapsedSize="0" TextLabelID="litTitle"> 
</act:CollapsiblePanelExtender> 

父頁,其中包括控制:

<uc:MyUserControl ID="clpTest" runat="server"> 
    <asp:Literal ID="litText" runat="server" /> 
</uc:MyUserControl> 

喜歡我將能夠在Parent.cs文件來完成:

litText.Text = "Anything"; 

我知道我們可以實現與ITemplate接口類似的功能,如下所示:http://msdn.microsoft.com/en-us/library/36574bf6.aspx

這將是這樣的:

<uc:MyUserControl ID="clpTest" runat="server"> 
    <ItemTemplate> 
      <asp:Literal ID="litText" runat="server" /> 
    </ItemTemplate> 
</uc:MyUserControl> 

但如果我這樣做,我將無法訪問litText的財產,我能達到的唯一途徑是用的FindControl,我想避免。

如果我能以這樣或那樣的方式達到我的目標,任何人都會對此有所暗示?

謝謝

+0

什麼最終目標?這個解決方案可能太複雜,無法滿足您的需求 – 2008-12-17 16:21:42

回答

3

好吧我固定在這裏是我使用的解決方案:在MyUserControl.ascx

<asp:PlaceHolder runat="server" ID="plhContent" /> 

然後:

在MyUserConstrol.ascx文件我已經把一個佔位符,我想innerHTML來顯示。 CS文件我加了那些屬性類:

[ParseChildren(false)] 
[PersistChildren(true)] 

我添加到文件這樣的:

public void RegisterUpdatePanel(UpdatePanel panel) 
{ 
    MethodInfo m = 
     (from methods in typeof (ScriptManager).GetMethods(BindingFlags.NonPublic | BindingFlags.Instance) 
     where methods.Name.Equals("System.Web.UI.IScriptManagerInternal.RegisterUpdatePanel") 
     select methods).First(); 

    m.Invoke(ScriptManager.GetCurrent(Page), new object[] {panel}); 
} 

protected override void CreateChildControls() 
{ 
    for (int i = 0; i < Controls.Count; i++) 
     if (Controls[i] is MyLastControl) 
      while (i + 2 < Controls.Count) 
      { 
       // In cas there is an updatepanel in the control we are moving 
       // We are registering an event to register the updatepanel 
       // to the scriptmanager again 
       SearchUpdatePanel(Controls[i + 2]); 
       plhContent.Controls.Add(Controls[i + 2]); 
      } 
    base.CreateChildControls(); 
} 

private void SearchUpdatePanel(Control control) 
{ 
    if (control is UpdatePanel) 
     control.Unload += updPnl_Unload; 

    foreach (Control childcontrol in control.Controls) 
     SearchUpdatePanel(childcontrol); 
} 

protected void updPnl_Unload(object sender, EventArgs e) 
{ 
    RegisterUpdatePanel((UpdatePanel) sender); 
} 

注意,我叫我的ASCX文件myLastContol最後控制,知道什麼是的innerHTML注入前的控制,因爲我不知道我收到什麼。該過程基本上是這樣的循環在用戶控件的控件,當你將到達用戶控件的結束,一切之後的innerHTML從父所以採取這些並將其移動到我想要他們的佔位符。

我希望這會幫助別人。

下面是一些消息來源我用來實現我的目標: Registering UpdatePanel

0

在隱藏文件的用戶控件的代碼添加公共財產。如果您需要設計時間支持,那麼需要更多的工作,但對於簡單場景(如您所概述的場景)應該足夠了。

然後,只需訪問它的父頁面設置值,用戶控件閱讀並使用該值來渲染任何你需要在那裏。

相關問題