My goal is to create a composite control that looks like, acts like and behaves like a RadioButtonList. There is some extra things done behind the scenes which are working no problem. What I am unable to accomplish is the desired markup to use the control. My ideal markup looks like this:
<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>
What I would like to do is pass the <asp:ListItems
> to the RadioButtonList in the composite control and have that handle everything required to produce/run the control.
Control Markup for 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 Behind for RadioButtonField:
???
What does the RadioButtonField code behind need to do in order to collect the <asp:ListItems
> and pass them to the RadioButtonList?
If you want the <ListItem>
style markup, here's what you'll have to do:
items
private field of type ListItemCollection
to your composite control Items
public property of type ListItemCollection
to your composite control. The getter should refer to the items
private field.ParseChildren
class attribute to your composite control so it will read the list. Your composite control now has the ability to read ListItem
nodes from its markup. When the control renders, all <ListItem>
nodes will be added to the private items
collection.
It would be wonderful if you could now just set the Items
member of the RadioButtonList, but unfortunately it is private. You will have to foreach
through the items
field and call the Add()
method on your child RadioButtonList.