支持 optgroup 元素的下拉列表






2.33/5 (11投票s)
自发布以来,ASP.NET 就缺乏对选项组的支持。我的目标是填补 .NET 框架中的这个空白。
引言
我最近注意到许多程序员在 .NET 框架的选择控件中缺少选项组功能。过了一段时间,我决定编写自己的控件,它的工作方式类似于 .NET 框架中可用的 System.Web.UI.DropDownList
控件。我的控件适用于 .NET framework 2.0 或更高版本。
背景,W3 推荐
在使用 DropDownGroupableList
控件时,请牢记 W3C 联盟定义的与选项组和选项项目相关的限制。请参阅 本文。一个优秀的网站程序员不仅仅取决于他程序代码的有效性 :-)
数据源类型
数据可以通过四种不同的方式提供
- 内联项目的定义
- 在代码中的
Items
集合中手动填充。 - 包含有效
IEnumerable
数据的DataSource
属性。 - 由
DataSourceID
属性引用的控件提供的声明性数据源。
注意:这使您可以指定选项组以及选项项目。
注意:请注意 Items
集合公开的 AddItem
和 AddGroup
方法。
通过 DataSource
属性声明性或手动提供的数据,可以以常规方式或分层方式进行处理 - 阅读下一段。
分层数据源支持
如果提供的数据源实现了 IHierarchicalEnumerable
,那么 DropDownGroupableList
的数据处理方式将略有不同。它是基于选项组和项目代表某种双层层次结构的理论。
您可以通过以下设置控制分层数据处理
IgnoreFirstBoundParent
- 此设置指示列表控件忽略第一个绑定父项,而是绑定其子项。这意味着第一个父项是实际绑定数据的根。当绑定具有在站点导航中不起作用的单个根节点的站点地图时,此设置会很有帮助。默认值为false
。BindEmptyParentAsListItem
- 此设置控制如何处理空父项。通常有两种方法可以处理空父项:创建一个没有子选项的选项组(这样它就无法被选中),或者创建一个可以选择的选项项目。默认值为true
。DataGroupTextField
,DataGroupTextFormatString
, 和DataGroupIDField
- 类似于DropDownList
中为人熟知的属性,但指的是选项组属性。
通用属性
如果您熟悉 System.Web.UI.WebControls.DropDownList
控件(阅读本文您应该熟悉它),您可能知道它的功能和行为。这里列出了一些我的控件与标准 DropDownList
共同拥有的重要且常用的功能。
AppendDataBoundItems
- 指定在绑定数据之前是否清除Items
集合的值。AutoPostBack
- 更改选定项目后将表单发送回服务器。CausesValidation
,ValidationGroup
- 这些属性协同工作以确保控件的有效性。DataTextField
,DataValueField
- 分别包含Text
属性值或Value
属性值的绑定对象属性的名称。
SelectedItemChanged
- 当选定项目更改时发生;请注意,此事件与选项组无关,因为选项组无法被选中。
与标准 DropDownList 的区别
SelectedValue
当您将 SelectedValue
属性的值设置为对应于多个项目的某个值时(例如,您插入了多个具有相同值的项目),将会抛出异常。
ListItem.Enabled
System.Web.UI.WebControls.ListItem
类的 Enabled
属性会影响它在页面上的可见性。我决定改变这种行为,因此将此值设置为 false
会通过 disabled HTML 属性将其禁用,但它仍然会被渲染。
Items 集合
此集合定义与抽象的 OptionItemBase
类配合使用,该类由 OptionListItem
和 OptionGroupItem
类实现。这使得我的列表控件可以在顶层包含选项项目和选项组。OptionGroupItem
类之后只能包含 OptionListItem
类实例,不允许嵌套内部组,因为它不是 W3 推荐的一部分。
示例
所附 zip 文件包含以下示例页面
- DynamicDataSource.aspx - 演示从代码隐藏动态填充。
- InlineDataDefinition.aspx - 演示内联
Items
定义。 - HierarchicalDataSource.aspx - 显示分层数据源功能的强大之处。
结论
创建和调试此组件花费了我不少时间,所以我希望它能对所有 ASP.NET 程序员有所帮助。欢迎随意使用 :-)