扩展DropDownList控件和ListBox控件(1) - 支持分组功能(optgroup标签)

DropDownList(ListBox)控件既强大又好用。为了让它更强大、更好用,咱们来写一个继承自DropDownList(ListBox)的控件。
[×××]


扩展DropDownList控件和ListBox控件(1) - 支持分组功能(optgroup标签)


做者: webabcd


介绍
扩展DropDownList控件和ListBox控件
经过 DropDownList控件和ListBox控件的.Items.Add(ListItem item)方法,来为其添加optgroup标签,从而实现分组功能


使用方法
一、设置属性:
OptionGroupValue - 用于添加DropDownList(ListBox)控件的分组项的ListItem的Value值(默认为optgroup
二、使用DropDownList(ListBox)控件的.Items.Add(ListItem item)方法:
OptionGroupValue为默认值时:SmartDropDownList.Items.Add(new ListItem("中国", "optgroup"));


图示
 
 
关键代码(以DropDownList为例)
SmartDropDownList.cs
using System;
using System.Collections.Generic;
using System.Text;

using System.Web.UI.WebControls;
using System.Web.UI;

[assembly: System.Web.UI.WebResource( "YYControls.SmartDropDownList.Resources.Icon.bmp", "p_w_picpath/bmp")]

namespace YYControls
{
         /// <summary>
         /// SmartDropDownList类,继承自DropDownList
         /// </summary>
        [ToolboxData( @"<{0}:SmartDropDownList runat='server'></{0}:SmartDropDownList>")]
        [System.Drawing.ToolboxBitmap( typeof(YYControls.Resources.Icon), "SmartDropDownList.bmp")]
         public partial class SmartDropDownList : DropDownList
        {
                 /// <summary>
                 /// 构造函数
                 /// </summary>
                 public SmartDropDownList()
                {

                }

                 /// <summary>
                 /// 将控件的内容呈现到指定的编写器中
                 /// </summary>
                 /// <param name="writer">writer</param>
                 protected override void RenderContents(HtmlTextWriter writer)    
                {
                         // 呈现Option或OptionGroup
                        OptionGroupRenderContents(writer);
                }
        }
}
 
Property.cs
using System;
using System.Collections.Generic;
using System.Text;

using System.ComponentModel;
using System.Web.UI;

namespace YYControls
{
         /// <summary>
         /// SmartDropDownList类的属性部分
         /// </summary>
         public partial class SmartDropDownList
        {
                 /// <summary>
                 /// 用于添加SmartDropDownList的分组项的ListItem的Value值
                 /// </summary>
                [
                Browsable( true),
                Description( "用于添加DropDownList的分组项的ListItem的Value值"),
                Category( "扩展")
                ]
                 public virtual string OptionGroupValue
                {
                        get
                        {
                                 string s = ( string)ViewState[ "OptionGroupValue"];

                                 return (s == null) ? "optgroup" : s;
                        }
                        set
                        {
                                ViewState[ "OptionGroupValue"] = value;
                        }
                }
        }
}
 
OptionGroup.cs
using System;
using System.Collections.Generic;
using System.Text;

using System.Data;
using System.Web.UI.WebControls;
using System.Web.UI;
using System.Web;

namespace YYControls
{
         /// <summary>
         /// SmartDropDownList类的属性部分
         /// </summary>
         public partial class SmartDropDownList
        {
                 /// <summary>
                 /// 呈现Option或OptionGroup
                 /// </summary>
                 /// <param name="writer">writer</param>
                 private void OptionGroupRenderContents(HtmlTextWriter writer)
                {
                         // 是否须要呈现OptionGroup的EndTag
                         bool writerEndTag = false;

                         foreach (ListItem li in this.Items)
                        {
                                 // 若是没有optgroup属性则呈现Option
                                 if (li.Value != this.OptionGroupValue)
                                {
                                         // 呈现Option
                                        RenderListItem(li, writer);
                                }
                                 // 若是有optgroup属性则呈现OptionGroup
                                 else
                                {
                                         if (writerEndTag)
                                                 // 呈现OptionGroup的EndTag
                                                OptionGroupEndTag(writer);
                                         else
                                                writerEndTag = true;

                                         // 呈现OptionGroup的BeginTag
                                        OptionGroupBeginTag(li, writer);
                                }
                        }

                         if (writerEndTag)
                                 // 呈现OptionGroup的EndTag
                                OptionGroupEndTag(writer);
                }

                 /// <summary>
                 /// 呈现OptionGroup的BeginTag
                 /// </summary>
                 /// <param name="li">OptionGroup数据项</param>
                 /// <param name="writer">writer</param>
                 private void OptionGroupBeginTag(ListItem li, HtmlTextWriter writer)
                {
                        writer.WriteBeginTag( "optgroup");
                        
                         // 写入OptionGroup的label
                        writer.WriteAttribute( "label", li.Text);

                         foreach ( string key in li.Attributes.Keys)
                        {
                                 // 写入OptionGroup的其它属性
                                writer.WriteAttribute(key, li.Attributes[key]);
                        }

                        writer.Write(HtmlTextWriter.TagRightChar);
                        writer.WriteLine();
                }

                 /// <summary>
                 /// 呈现OptionGroup的EndTag
                 /// </summary>
                 /// <param name="writer">writer</param>
                 private void OptionGroupEndTag(HtmlTextWriter writer)
                {
                        writer.WriteEndTag( "optgroup");
                        writer.WriteLine();
                }

                 /// <summary>
                 /// 呈现Option
                 /// </summary>
                 /// <param name="li">Option数据项</param>
                 /// <param name="writer">writer</param>
                 private void RenderListItem(ListItem li, HtmlTextWriter writer)
                {
                        writer.WriteBeginTag( "option");

                         // 写入Option的Value
                        writer.WriteAttribute( "value", li.Value, true);

                         if (li.Selected)
                        {
                                 // 若是该Option被选中则写入selected
                                writer.WriteAttribute( "selected", "selected", false);
                        }

                         foreach ( string key in li.Attributes.Keys)
                        {
                                 // 写入Option的其它属性
                                writer.WriteAttribute(key, li.Attributes[key]);
                        }

                        writer.Write(HtmlTextWriter.TagRightChar);

                         // 写入Option的Text
                        HttpUtility.HtmlEncode(li.Text, writer);

                        writer.WriteEndTag( "option");
                        writer.WriteLine();
                }
        }
}