2009-03-04 4 views
2

Ich versuche, einem vereinfachten zusammengesetzten Steuerelement, das ein Label und ein TextBox enthält, eine Vorlage hinzuzufügen. Ich möchte, dass meine Marke, so etwas zu sehen:Wie kann ich ein ASP.NET-Template-Composite-Steuerelement haben?

<test:FormItem ID="fi" runat="server" Title="MyTitle" Text="My Text!"> 
    <TestTemplate> 
     <i> 
      <%# Container.Title) %></i> 
     <br /> 
     <%# Container.Text %> 
    </TestTemplate> 
</test:FormItem> 

Ich habe eine templateContainer Klasse, die Eigenschaften für das TextBox und Label hat.

public class TemplateContainer : WebControl, INamingContainer 
{ 

    public TextBox Text { get { return m_item.Text; } } 
    public Label Title { get { return m_item.Title; } } 

    private FormItem m_item; 

    public TemplateContainer(FormItem item) 
    { 
     m_item = item; 
    } 

} 

Im Haupt FormItem Klasse I einen CreateControlHierarchy() -Methode, die von Create aufgerufen wird():

protected virtual void CreateControlHierarchy() 
    { 

     m_itemTemplateContainer = new TemplateContainer(this); 
     TestTemplate.InstantiateIn(m_itemTemplateContainer); 

     Controls.Add(m_itemTemplateContainer); 

    } 

, was ich will für die Vorlage ist die tatsächliche Kontrolle zu machen. Stattdessen ruft es ToString() auf dem Steuerelement auf und zeigt System.Web.UI.WebControls.Label und System.Web.UI.WebControls.TextBox an. Gibt es eine Möglichkeit, die Vorlage zu der Sammlung der Steuerelemente hinzuzufügen, statt nur ToString() für sie aufzurufen?

Hinweis: Ich habe auch versucht, die Textbox und die Beschriftung der Steuerelementsammlung des Containers hinzuzufügen, die dasselbe tut.

Antwort

1

Ok. Also habe ich ein paar Dinge ausprobiert und eine gute Lösung gefunden.

Zuerst habe ich versucht, Methoden im Datenbindungsausdruck zu verwenden und dann zu verfolgen, wo in der Control-Sammlung des Containers die Textbox oder das Label abgelegt würde. Der CompiledTemplateBuilder (was .Net intern für ITemplates erstellt, die in mark up angegeben sind) setzt jedoch das gesamte Markup vor und nach beiden Bindungsausdrücken in ein DataBoundLiteral-Steuerelement und die Control-Auflistung wurde bereits beim Aufruf der Methode erstellt.

Was war Arbeit, um ein neues WebControl zu erstellen, das als Platzhalter für die Steuerelemente innerhalb des Verbundsteuerelements dient. Es hat eine Eigenschaft Control und wenn es gesetzt ist, fügt es das Steuerelement zu seiner Controls Collection hinzu.

Dann in der Mark up, ich ein Steuerelement dieses Typs erstellen und seine Control-Eigenschaft an die richtige Eigenschaft im Container binden.

<test:FormItem ID="fi" runat="server" Title="MyTitle" Text="My Text!"> 
    <TestTemplate> 
     <i> 
     <test:FormItemPlaceHolder ID="ph" runat="server" 
      Control='<%# Container.Title %>' /> 
     </i> 
     <br /> 
     <test:FormItemPlaceHolder ID="ph2" runat="server" 
      Control='<%# Container.Text %>' /> 
    </TestTemplate> 
</test:FormItem> 

Hat jemand eine bessere Lösung?

0

Der Container sollte nicht die Steuerelemente definieren, nur die Daten.

In der Markup sollten Sie die tatsächlichen Steuerelemente der Daten definieren und ihnen die Werte aus dem Container zuweisen.

z.

public class TemplateContainer : UserControl 
{ 
    public string Text { get { return m_text; } } 
    public string Title { get { return m_title; } } 

    private string m_text; 
    private string m_title; 
    private FormItem m_item; 

    public TemplateContainer(FormItem item) 
    { 
     m_item = item; 
    } 

} 

Und im Markup:

<test:FormItem ID="fi" runat="server" Title="MyTitle" Text="My Text!"> 
     <TestTemplate> 
      <i><asp:Label runat="server" Text='<%# Container.Title) %>' /></i> 
      <br /> 
      <asp:TextBox runat="server" Text='<%# Container.Text %>' /> 
    </TestTemplate> 
</test:FormItem> 

Wenn Sie ein Composite-Steuerelement zu erstellen versuchen, die in der Markup hinzugefügt keine Kontrollen erfordern werden, warum dann verwenden Sie eine Vorlage? Wenn es nur zum Styling gehört, ist es vielleicht effektiver, ein eigenes Style-Objekt zu erstellen?

+0

Ich möchte ein Composite-Steuerelement (Steuerelement der Steuerelemente) erstellen und dem Benutzer Markup um die Steuerelemente hinzufügen. Hinweis: Ich möchte kein Benutzersteuerelement erstellen. Ich habe benutzerdefinierte Logik für die Steuerelemente in der Composite-Steuerelement und ich möchte es über Anwendungen verwendet werden. – rmw

+0

Müssen die Benutzer die eigentlichen Steuerelemente selbst verschieben oder Markup vor und nach ihnen platzieren? – codemonkeh