ASP.NET 2.0在 DropDownList
控件中缺少OptionGroup功能 (<optgroup>
。 这意味着不可能获得一个选择控件,如下所示:
为此,我构建了一个用户呈现控件,可以用于. NET 框架 2.0或者更高版本,具有以下功能。 这里控件支持以下功能( 就像在. NET 框架中构建的System.Web.UI.DropDownList
控件一样):
EnableViewState
属性AutoPostBack
属性AppendDataBoundItems
属性SelectedValue
属性Selected
属性ValueChanged
事件DataBind
你可以在设计时使用该控件,如下所示:
<ddlb:optiongroupselectid="OptionGroupSelect1"runat="server"enableviewstate="true"><ddlb:OptionGroupItemID="OptionGroupItem1"runat="server"Value="1"Text="ONE"OptionGroup="Odd"/><ddlb:OptionGroupItemID="OptionGroupItem2"runat="server"Value="2"Text="TWO"OptionGroup="Even"/><ddlb:OptionGroupItemID="OptionGroupItem3"runat="server"Value="3"Text="TREE"OptionGroup="Odd"/><ddlb:OptionGroupItemID="OptionGroupItem4"runat="server"Value="4"Text="FOUR"OptionGroup="Even"/></ddlb:optiongroupselect>
不需要将属于同一OptionGroup的项放置在。
或者,如果你希望在代码中使用该控件,请执行下列操作:
protectedvoid Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
this.OptionGroupSelect1.Items.Add(new OptionGroupItem("A",
"Letter A", "Letters"));
this.OptionGroupSelect1.Items.Add(new OptionGroupItem("B",
"Letter B", "Letters"));
this.OptionGroupSelect1.Items.Add(new OptionGroupItem("C",
"Letter C", "Letters"));
}
}
本文附带的解决方案由两个项目组成。 第一个是类库,它的中有控件及它的相关类的源,第二个是web应用程序,用于测试控件行为。
在项目库中,我们可以找到以下类:
OptionGroupSelect
是控件。它从 DataBoundControl
继承,最后扩展 WebControl
类。 我扩展 DataBoundControl
类,因为它用作所有 ASP.NET 2.0数据绑定控件的基类,它们在列表表单中显示数据。 这个基类给了我执行渲染控件的数据绑定操作的功能。OptionGroupItem
表示具有 relative 属性的单个"列表项": Text
,Value
,OptionGroup
和 Selected
。 它继承了 WebControl
类,并只重写了 Render
方法。OptionGroupSelectControlDesigner
用于执行设计时控制渲染。OptionGroupItemBuilder
用于通知父控件 OptionGroupSelect
,它已经分析了一个HTML元素,并将它的添加到了父属性的ControlCollection中。 基本上,它允许我在设计时创建子项。主控件( OptionGroupSelect
) 重写 LoadViewState
方法以检索视图状态值,用于维护控件状态。 因此,SaveViewState
也被覆盖。
由于控件实现 IPostBackDataHandler
接口,因此重写 LoadPostData
方法以检测所选值是否从任何用户选择中更改。 在这种情况下,它返回 true,因此 ValueChanged
事件被触发。
对于 Render
方法,我绘制 select
HTML控件,添加 optgroup
元素,对于每个子列表项,调用 relative RenderControl
方法。
如果子项定义了 OptionGroup
属性,则按这里值对它们进行分组,因这里将相同 OptionGroup
的项设置为。 没有 OptionGroup
值的项将被正常处理。
就像我所说,邮件控件扩展了 DataBoundControl
类。 这意味着必须重写某些方法以获得数据绑定行为。 这些方法包括:
PerformSelect
: 这里方法因 DataBind
调用而被调用。 它提取数据源并将它的作为 IEnumerable
对象公开。 有趣的是,数据源对象不必是 DataSet
。 它还接受 DataTable
。DataView
或者 List<OptionGroupItem>
。 此外,该方法 this.GetData( )
使用 inside 从 DataSet
提取从指向的DataSourceView
对象,该对象指向由 DataMember
属性指示的指定 DataTable
。PerformDataBinding
: 这里方法执行实际工作。 对于每个项目,创建一个 OptionGroupItem
实例并将它的添加到 OptionGroupSelect
子 Controls
集合中。关于自定义数据绑定的更多细节可以在找到。