支持OptionGroup的ASP.NET下拉控件

序言 

ASP.NET 2.0虽然很有特色,不足的是有一些奇特的功能全然不知。像这一样一个显著的疏忽,下拉控件不支持OptionGroup(<optgroup>) ,<optgroup> 元素也是XHTML的一部分,各式各样的分类选项列在<select>标签里。像下列图所显示:

当我第一次去寻找并解决这个控件问题时,网上关于这类文章的不。发现一个CodeProject 的成员提供了一个很好的方案。看上去得用很多代码才能实现,不过我相信能应该有更好的方法实现。我看了一些评论,这明显是使用Control Adapter(控件适配器)来完成。Control Adapter是ASP.NET2.0里的一个新概念,它允许开发者通过重写rendering 行为去实现任何控件,多好的东西!此外,Control Adapter还与浏览器文件关联使用。掌握好这些的知识,解决这个问题就变得简单了。以后如果有更好的方法,我将在这与大家分享。

代码如下:

 

public   class  DropDownListAdapter : 
       System.Web.UI.WebControls.Adapters.WebControlAdapter 
{
    
protected override void RenderContents(HtmlTextWriter writer) {
        DropDownList list 
= this.Control as DropDownList;
        
string currentOptionGroup;
        List
<string> renderedOptionGroups = new List<string>();
        
foreach(ListItem item in list.Items) {
            
if(item.Attributes["OptionGroup"== null{
                RenderListItem(item, writer);
            }
 else {
                currentOptionGroup 
= item.Attributes["OptionGroup"];
                
if(renderedOptionGroups.Contains(currentOptionGroup)) {
                    RenderListItem(item, writer);
                }
 else {
                    
if(renderedOptionGroups.Count > 0{
                        RenderOptionGroupEndTag(writer);
                    }

                    RenderOptionGroupBeginTag(currentOptionGroup, 
                                              writer);
                    renderedOptionGroups.Add(currentOptionGroup);
                    RenderListItem(item, writer);
                }

            }

        }

        
if(renderedOptionGroups.Count > 0{
            RenderOptionGroupEndTag(writer);
        }

    }

    
private void RenderOptionGroupBeginTag(string name, 
                 HtmlTextWriter writer) 
{
        writer.WriteBeginTag(
"optgroup");
        writer.WriteAttribute(
"label", name);
        writer.Write(HtmlTextWriter.TagRightChar);
        writer.WriteLine();
    }

    
private void RenderOptionGroupEndTag(HtmlTextWriter writer) {
        writer.WriteEndTag(
"optgroup");
        writer.WriteLine();
    }

    
private void RenderListItem(ListItem item, 
                 HtmlTextWriter writer) 
{
        writer.WriteBeginTag(
"option");
        writer.WriteAttribute(
"value", item.Value, true);
        
if(item.Selected) {
            writer.WriteAttribute(
"selected""selected"false);
        }

        
foreach(string key in item.Attributes.Keys) {
            writer.WriteAttribute(key, item.Attributes[key]);
        }

        writer.Write(HtmlTextWriter.TagRightChar);
        HttpUtility.HtmlEncode(item.Text, writer);
        writer.WriteEndTag(
"option");
        writer.WriteLine();
    }

}

lotuspro

 

原文:http://www.codeproject.com/aspnet/DropDownListOptionGroup.asp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值