zoukankan      html  css  js  c++  java
  • 扩展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
    {
        
    /// <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();
            }

        }

    }
    作者:wpf之家
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    BloomFilter——读数学之美札记
    线性时间求最长回文子串
    python之装饰器详解
    多线程快速排序(思考)
    搬家
    webapp用户身份认证方案 JSON WEB TOKEN 实现
    Java多线程问题总结
    synchronized的4种用法
    线程池的工作原理及使用示例
    Http 请求 GET和POST的区别
  • 原文地址:https://www.cnblogs.com/wpf123/p/2347473.html
Copyright © 2011-2022 走看看