2009-02-24 6 views
1

Mon objectif est de créer un contrôle composite qui ressemble à, agit comme et se comporte comme un RadioButtonList. Il y a des choses supplémentaires dans les coulisses qui ne posent aucun problème. Ce que je suis incapable d'accomplir est le balisage désiré pour utiliser le contrôle. Mon balisage idéal ressemble à ceci:Création d'un contrôle composite avec des éléments imbriqués

<cc1:RadioButtonField ID="rfCardType" runat="server" Title="Card Type:"> 
    <asp:ListItem Enabled="true" Text="MasterCard" /> 
    <asp:ListItem Enabled="true" Text="Visa" /> 
    <asp:ListItem Enabled="true" Text="Amex" /> 
</cc1:RadioButtonField> 

Ce que je voudrais faire est de passer le <asp:ListItems> à la RadioButtonList dans le contrôle composite et ont cette poignée tout le nécessaire pour produire/exécuter le contrôle.

contrôle Markup pour RadioButtonField:

<div class="Title"> 
    <asp:Label ID="lblTitle" runat="server" AssociatedControlID="rblField" /> 
</div> 
<div class="Text"> 
    <asp:RadioButtonList ID="rblField" runat="server" Visible="true"> 
    </asp:RadioButtonList> 
</div> 

code Derrière pour RadioButtonField:

??? 

Qu'est-ce que le code RadioButtonField derrière nécessaire de faire afin de recueillir les <asp:ListItems> et laissez-passer les à la RadioButtonList?

Répondre

2

Si vous voulez que le balisage de style <ListItem>, voici ce que vous devez faire:

  1. Ajouter un items champ privé de type ListItemCollection à votre contrôle composite
  2. Ajouter une propriété publique Items de type ListItemCollection à votre contrôle composite. Le getter doit se référer au champ privé items.
  3. Ajoutez l'attribut de classe ParseChildren à votre contrôle composite pour qu'il lise la liste.

Votre contrôle composite a maintenant la capacité de lire ListItem nœuds à partir de son balisage. Lorsque le contrôle s'affiche, tous les noeuds <ListItem> seront ajoutés à la collection privée items.

Ce serait merveilleux si vous pouviez maintenant simplement définir le membre Items de RadioButtonList, mais malheureusement il est privé. Vous devrez foreach via le champ items et appelez la méthode Add() sur votre RadioButtonList enfant.

+0

Cela fait l'affaire. Maintenant, comment est-ce que j'arriverais à intellisense affichant l'asp: ListItem comme option disponible? –

+0

Une fois que l'attribut est ajouté et câblé à la propriété publique Items, cela devrait se faire automatiquement. –

+0

Cela n'arrive pas automatiquement ... hmmm –

1
[PersistenceMode(PersistenceMode.innerProperty)] 
[DesignerSerializationVisibility(DesignerSerilizationVisibility.Content)] 
ListCollection Items 
{ 
} 

Peut-être essayer ces deux attributs. Le PersistChildrenAttribute prend uniquement en charge le concepteur pour votre contrôle avec Visual Studio. DesignerSerializationVisibility.Content sérialise le contenu du type de données de collection

Questions connexes