帮酷LOGO
  • 显示原文与译文双语对照的内容
文章标签:dropdownlist  


介绍

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"));
 }
}

Points of interest

本文附带的解决方案由两个项目组成。 第一个是类库,它的中有控件及它的相关类的源,第二个是web应用程序,用于测试控件行为。

在项目库中,我们可以找到以下类:

  • OptionGroupSelect 是控件。它从 DataBoundControl 继承,最后扩展 WebControl 类。 我扩展 DataBoundControl 类,因为它用作所有 ASP.NET 2.0数据绑定控件的基类,它们在列表表单中显示数据。 这个基类给了我执行渲染控件的数据绑定操作的功能。
  • OptionGroupItem 表示具有 relative 属性的单个"列表项": TextValueOptionGroupSelected 。 它继承了 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 。 它还接受 DataTableDataView 或者 List<OptionGroupItem> 。 此外,该方法 this.GetData( ) 使用 inside 从 DataSet 提取从指向的DataSourceView 对象,该对象指向由 DataMember 属性指示的指定 DataTable
  • PerformDataBinding: 这里方法执行实际工作。 对于每个项目,创建一个 OptionGroupItem 实例并将它的添加到 OptionGroupSelectControls 集合中。

关于自定义数据绑定的更多细节可以在找到。



文章标签:dropdownlist  

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语