I've recently noticed that many programmers miss the functionality of option groups in the .NET Framework selection controls. After a while, I decided to write my own control, that works similar to the
System.Web.UI.DropDownList control available in the.NET framework. My control is available for .NET framework 2.0 or later.
Background, W3 recommendation
When working with the
DropDownGroupableList control, please keep in mind the restrictions related to option groups and option items defined by the W3 Consortium. See this article. A good website programmer is not defined only through the effectiveness of his program code :-)
Data source types
Data can be delivered in four different ways:
- Inline items definition
Note: this enables you to specify option groups as well as option items.
- Manual filling in the
Items collection in your code.
Note: Notice the
AddGroup methods exposed by the
DataSource property containing valid
- Declarative data source provided by the control referenced by the
Provided data, declarative or manual through the
DataSource property, may be handled the normal way, or hierarchically - read the following paragraph.
Hierarchical data source support
If the provided data source implements
DropDownGroupableList works a little differently according to data processing. It is based on the theory that option groups, together with items, represent some kind of two-level hierarchy.
You can control hierarchical data processing by these settings:
IgnoreFirstBoundParent - this instructs a list control that it should ignore the first bound parent and bind its children instead. This means that the first parent is the root of the data that is really bound. This can be helpful when binding site maps that have one root node that plays no role inside site navigation. The default value is
BindEmptyParentAsListItem - this setting controls how to process empty parents. There are generally two ways you can handle empty parents: create an option group with no child options (then it cannot be selected), or create an option item you can select. The default value is
DataGroupIDField - similar to the well-known properties from
DropDownList, but refers to option group attributes.
If you are familiar with the
System.Web.UI.WebControls.DropDownList control (and you should be when reading this article), you probably know its functionality and behavior. Here are listed some important and commonly used capabilities that my control has in common with the standard
AppendDataBoundItems - value that specifies if the
Items collection is cleared before binding data.
AutoPostBack - sends form back to the server after the selected item is changed.
ValidationGroup - properties that work together to ensure the control's validity
DataValueField - names of bound object properties that contain the
Text property value or the
Value property value, respectively.
SelectedItemChanged - occurs when the selected item changes; note this event is not related to option groups since they cannot be selected.
Differences from the standard DropDownList
When you set the value of the property
SelectedValue to a value that corresponds to more than one item (e.g., you inserted more items with the same value), then an exception is thrown.
Enabled property of the
System.Web.UI.WebControls.ListItem class influences its visibility on the page. I decided to change this behavior, so setting this value to
false makes it disabled via the disabled HTML attribute, but it is still being rendered.
This collection definition works with the abstract
OptionItemBase class that is implemented by the
OptionGroupItem classes. This enables my list control to contain option items as well as option groups at the top level. The
OptionGroupItem class then may contain only
OptionListItem class instances, no inner groups are allowed since it is not part of the W3 recommendation.
The attached zip file contains the following sample pages:
- DynamicDataSource.aspx - demonstrates dynamic filling in from code-behind.
- InlineDataDefinition.aspx - demonstrates inline
- HierarchicalDataSource.aspx - shows capabilities of hierarchical data source functionality.
It took me some noticeable time to create and debug this component, so I hope it will be helpful for all ASP.NET programmers. Feel free to use it :-)