天天看点

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

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

<a href="http://down.51cto.com/data/101204" target="_blank">[源码下载]</a>

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

介绍

扩展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为例)

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", "image/bmp")] 

namespace YYControls 

        /// &lt;summary&gt; 

        /// SmartDropDownList类,继承自DropDownList 

        /// &lt;/summary&gt; 

        [ToolboxData(@"&lt;{0}:SmartDropDownList runat='server'&gt;&lt;/{0}:SmartDropDownList&gt;")] 

        [System.Drawing.ToolboxBitmap(typeof(YYControls.Resources.Icon), "SmartDropDownList.bmp")] 

        public partial class SmartDropDownList : DropDownList 

        { 

                /// &lt;summary&gt; 

                /// 构造函数 

                /// &lt;/summary&gt; 

                public SmartDropDownList() 

                { 

                } 

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

                /// &lt;param name="writer"&gt;writer&lt;/param&gt; 

                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 

                /// &lt;param name="li"&gt;OptionGroup数据项&lt;/param&gt; 

                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 

                /// &lt;param name="li"&gt;Option数据项&lt;/param&gt; 

                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

     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/345425,如需转载请自行联系原作者

继续阅读