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

翻译|其它|编辑:郝浩|2008-01-04 10:42:39.000|阅读 2566 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

介绍
扩展 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
{
    /**//// <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.Text, writer);
                }
            }

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

        /**//// <summary>
        /// 呈现 OptionGroup 的 BeginTag
        /// </summary>
        /// <param name="label">OptionGroup 的文本</param>
        /// <param name="writer">writer</param>
        private void OptionGroupBeginTag(string label, HtmlTextWriter writer)
        {
            writer.WriteBeginTag("optgroup");
            // 写入 OptionGroup 的 label
            writer.WriteAttribute("label", label);
            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">数据项</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();
        }
    }
}


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:.NET博客园

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP