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之家
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Python学习札记(十五) 高级特性1 切片
    LeetCode Longest Substring Without Repeating Characters
    Python学习札记(十四) Function4 递归函数 & Hanoi Tower
    single number和变体
    tusen 刷题
    实验室网站
    leetcode 76. Minimum Window Substring
    leetcode 4. Median of Two Sorted Arrays
    leetcode 200. Number of Islands 、694 Number of Distinct Islands 、695. Max Area of Island 、130. Surrounded Regions 、434. Number of Islands II(lintcode) 并查集 、178. Graph Valid Tree(lintcode)
    刷题注意事项
  • 原文地址:https://www.cnblogs.com/wpf123/p/2347473.html
Copyright © 2011-2022 走看看