天天看点

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

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

[×××]

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

作者:webabcd

介绍

扩展DropDownList控件和ListBox控件:

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

使用方法

1、设置属性:

OptionGroupValue - 用于添加DropDownList(ListBox)控件的分组项的ListItem的Value值(默认为optgroup)

2、使用DropDownList(ListBox)控件的.Items.Add(ListItem item)方法:

OptionGroupValue为默认值时:SmartDropDownList.Items.Add(new ListItem("中国", "optgroup"));

图示

扩展DropDownList控件和ListBox控件(1) - 支持分组功能(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()

                {

                }

                /// 将控件的内容呈现到指定的编写器中

                /// <param name="writer">writer</param>

                protected override void RenderContents(HtmlTextWriter writer)    

                        // 呈现Option或OptionGroup

                        OptionGroupRenderContents(writer);

        }

}

Property.cs

using System.ComponentModel;

        /// SmartDropDownList类的属性部分

        public partial class SmartDropDownList

                /// 用于添加SmartDropDownList的分组项的ListItem的Value值

                [

                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.Data;

using System.Web;

                /// 呈现Option或OptionGroup

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

                /// 呈现OptionGroup的BeginTag

                /// <param name="li">OptionGroup数据项</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();

                /// 呈现OptionGroup的EndTag

                private void OptionGroupEndTag(HtmlTextWriter writer)

                        writer.WriteEndTag("optgroup");

                /// 呈现Option

                /// <param name="li">Option数据项</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);

                                // 写入Option的其它属性

                        // 写入Option的Text

                        HttpUtility.HtmlEncode(li.Text, writer);

                        writer.WriteEndTag("option");

OK