• 扩展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为例)
    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();
            }

        }

    }


    OK
    [源码下载]
  • 相关阅读:
    Android 内存剖析 – 发现潜在问题
    Android内存泄漏问题(一)
    Android的事件处理机制详解(二)-----基于监听的事件处理机制
    Android的事件处理机制(一)------基于回调机制的事件处理
    OOA、OOD 和 OOP
    面向对象初识
    Python 2 和 Python 3 的区别
    软件开发规范
    语法分析和词法分析
    循环删除的坑
  • 原文地址:https://www.cnblogs.com/webabcd/p/1024977.html
Copyright © 2020-2023  润新知