2009-03-04 4 views
2

J'essaie d'ajouter un modèle à un contrôle composite simplifié contenant un label et un TextBox. Je veux que ma marque à ressembler à quelque chose comme ceci:Comment puis-je avoir un contrôle composite basé sur un modèle ASP.NET?

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

J'ai une classe templateContainer qui a des propriétés pour la zone de texte et de l'étiquette.

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; 
    } 

} 

Dans la classe principale FormItem J'ai une méthode CreateControlHierarchy() qui est appelé à partir CreateChildControls():

protected virtual void CreateControlHierarchy() 
    { 

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

     Controls.Add(m_itemTemplateContainer); 

    } 

Ce que je veux pour le modèle de rendre le contrôle effectif. Au lieu de cela, il appelle ToString() sur le contrôle et affiche System.Web.UI.WebControls.Label et System.Web.UI.WebControls.TextBox. Est-il possible de faire en sorte que le modèle ajoute les contrôles à sa collection au lieu de simplement appeler ToString() sur eux?

Remarque: J'ai également essayé d'ajouter la zone de texte et l'étiquette à la collection de contrôles du conteneur qui fait la même chose.

Répondre

1

Ok. J'ai donc essayé quelques choses et j'ai trouvé une solution OK. D'abord, j'ai essayé d'utiliser des méthodes dans l'expression de liaison de données, puis de suivre l'emplacement de la zone de texte ou de l'étiquette dans la collection Control du conteneur. Cependant, CompiledTemplateBuilder (qui est ce que .Net construit en interne pour ITemplates spécifié dans le balisage) met tout le balisage avant et après les deux expressions de liaison dans un contrôle DataBoundLiteral et la collection Control a déjà été construite lorsque la méthode a été appelée.

Qu'est-ce que le travail a été de créer un nouveau WebControl qui sert de placeholder pour les contrôles dans le contrôle composite. Il a un contrôle de propriété et lorsqu'il est défini, il ajoute le contrôle à sa collection de contrôles. Puis, dans la majoration, je crée un contrôle de ce type et lie sa propriété Control à la propriété correcte dans le conteneur.

<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> 

Est-ce que quelqu'un a une meilleure solution?

0

Le conteneur ne doit pas définir les contrôles, mais seulement les données.

Dans le balisage, vous devez définir les contrôles réels des données et leur attribuer les valeurs du conteneur.

E.g.

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; 
    } 

} 

Et dans le balisage:

<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> 

Si vous essayez de créer un contrôle composite qui ne nécessite pas de contrôle à ajouter dans le balisage, alors pourquoi utilisez-vous un modèle? Si c'est juste pour le style alors peut-être créer votre propre objet Style peut-être plus efficace?

+0

Je souhaite créer un contrôle composite (contrôle des contrôles) et permettre à l'utilisateur d'ajouter un balisage autour des contrôles. Remarque: je ne souhaite pas créer de UserControl. J'ai une logique personnalisée pour les contrôles dans le contrôle composite et je veux l'utiliser dans toutes les applications. – rmw

+0

Les utilisateurs doivent-ils être en mesure de déplacer les contrôles eux-mêmes, ou simplement être en mesure de placer un balisage avant et après? – codemonkeh

Questions connexes