亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用<optgroup>的asp.net(webforms)的Dropdownlist控件?

使用<optgroup>的asp.net(webforms)的Dropdownlist控件?

Cats萌萌 2019-11-27 11:07:56
誰能為asp.net(3.5)推薦一個可以呈現選項組的下拉列表控件?謝謝
查看完整描述

3 回答

?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

我過去使用過標準控件,只是為其添加了一個簡單的ControlAdapter,它將覆蓋默認行為,因此它可以在某些位置呈現<optgroup>。即使您的控件不需要特殊的行為,這也能很好地工作,因為附加功能不會妨礙您。


請注意,這是出于特定目的并用.Net 2.0編寫,因此它可能也不適合您,但至少應為您提供一個起點。另外,您還必須在項目中使用.browserfile進行連接(示例請參見文章末尾)。


'This codes makes the dropdownlist control recognize items with "--"

'for the label or items with an OptionGroup attribute and render them

'as <optgroup> instead of <option>.

Public Class DropDownListAdapter

    Inherits System.Web.UI.WebControls.Adapters.WebControlAdapter


    Protected Overrides Sub RenderContents(ByVal writer As HtmlTextWriter)

        Dim list As DropDownList = Me.Control

        Dim currentOptionGroup As String

        Dim renderedOptionGroups As New Generic.List(Of String)


        For Each item As ListItem In list.Items

            Page.ClientScript.RegisterForEventValidation(list.UniqueID, item.Value)

            If item.Attributes("OptionGroup") IsNot Nothing Then

                'The item is part of an option group

                currentOptionGroup = item.Attributes("OptionGroup")

                If Not renderedOptionGroups.Contains(currentOptionGroup) Then

                    'the header was not written- do that first

                    'TODO: make this stack-based, so the same option group can be used more than once in longer select element (check the most-recent stack item instead of anything in the list)

                    If (renderedOptionGroups.Count > 0) Then

                        RenderOptionGroupEndTag(writer) 'need to close previous group

                    End If

                    RenderOptionGroupBeginTag(currentOptionGroup, writer)

                    renderedOptionGroups.Add(currentOptionGroup)

                End If

                RenderListItem(item, writer)

            ElseIf item.Text = "--" Then 'simple separator

                RenderOptionGroupBeginTag("--", writer)

                RenderOptionGroupEndTag(writer)

            Else

                'default behavior: render the list item as normal

                RenderListItem(item, writer)

            End If

        Next item


        If renderedOptionGroups.Count > 0 Then

            RenderOptionGroupEndTag(writer)

        End If

    End Sub


    Private Sub RenderOptionGroupBeginTag(ByVal name As String, ByVal writer As HtmlTextWriter)

        writer.WriteBeginTag("optgroup")

        writer.WriteAttribute("label", name)

        writer.Write(HtmlTextWriter.TagRightChar)

        writer.WriteLine()

    End Sub


    Private Sub RenderOptionGroupEndTag(ByVal writer As HtmlTextWriter)

        writer.WriteEndTag("optgroup")

        writer.WriteLine()

    End Sub


    Private Sub RenderListItem(ByVal item As ListItem, ByVal writer As HtmlTextWriter)

        writer.WriteBeginTag("option")

        writer.WriteAttribute("value", item.Value, True)

        If item.Selected Then

            writer.WriteAttribute("selected", "selected", False)

        End If


        For Each key As String In item.Attributes.Keys

            writer.WriteAttribute(key, item.Attributes(key))

        Next key


        writer.Write(HtmlTextWriter.TagRightChar)

        HttpUtility.HtmlEncode(item.Text, writer)

        writer.WriteEndTag("option")

        writer.WriteLine()

    End Sub

End Class

這是同一類的C#實現:


/* This codes makes the dropdownlist control recognize items with "--"

 * for the label or items with an OptionGroup attribute and render them

 * as <optgroup> instead of <option>.

 */

public class DropDownListAdapter : WebControlAdapter

{

    protected override void RenderContents(HtmlTextWriter writer)

    {

        //System.Web.HttpContext.Current.Response.Write("here");

        var list = (DropDownList)this.Control;

        string currentOptionGroup;

        var renderedOptionGroups = new List<string>();


        foreach (ListItem item in list.Items)

        {

            Page.ClientScript.RegisterForEventValidation(list.UniqueID, item.Value);

            //Is the item part of an option group?

            if (item.Attributes["OptionGroup"] != null)

            {

                currentOptionGroup = item.Attributes["OptionGroup"];

                //Was the option header already written, then just render the list item

                if (renderedOptionGroups.Contains(currentOptionGroup))

                    RenderListItem(item, writer);

                //The header was not written,do that first

                else

                {

                    //Close previous group

                    if (renderedOptionGroups.Count > 0)

                        RenderOptionGroupEndTag(writer);


                    RenderOptionGroupBeginTag(currentOptionGroup, writer);

                    renderedOptionGroups.Add(currentOptionGroup);

                    RenderListItem(item, writer);

                }

            }

            //Simple separator

            else if (item.Text == "--")

            {

                RenderOptionGroupBeginTag("--", writer);

                RenderOptionGroupEndTag(writer);

            }

            //Default behavior, render the list item as normal

            else

                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();

    }

}

我的瀏覽器文件名為“ App_Browsers \ BrowserFile.browser”,看起來像這樣:


<!--

    You can find existing browser definitions at

    <windir>\Microsoft.NET\Framework\<ver>\CONFIG\Browsers

-->

<browsers>

   <browser refID="Default">

      <controlAdapters>

        <adapter controlType="System.Web.UI.WebControls.DropDownList" 

               adapterType="DropDownListAdapter" />

      </controlAdapters>

   </browser>

</browsers>


查看完整回答
反對 回復 2019-11-27
?
慕慕森

TA貢獻1856條經驗 獲得超17個贊

我使用JQuery來完成此任務。我首先為ListItem后端的每個對象添加了一個新屬性,然后在JQuery wrapAll()方法中使用該屬性來創建組...


C#:


foreach (ListItem item in ((DropDownList)sender).Items)

{

    if (System.Int32.Parse(item.Value) < 5)

        item.Attributes.Add("classification", "LessThanFive");

    else

        item.Attributes.Add("classification", "GreaterThanFive");

jQuery的:


$(document).ready(function() {

    //Create groups for dropdown list

    $("select.listsmall option[@classification='LessThanFive']")

        .wrapAll("&lt;optgroup label='Less than five'&gt;");

    $("select.listsmall option[@classification='GreaterThanFive']")

        .wrapAll("&lt;optgroup label='Greater than five'&gt;"); 

});


查看完整回答
反對 回復 2019-11-27
?
揚帆大魚

TA貢獻1799條經驗 獲得超9個贊

這里是C#版本:




using System;

using System.Web.UI.WebControls.Adapters;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Collections.Generic;

using System.Web;


//This codes makes the dropdownlist control recognize items with "--"'

//for the label or items with an OptionGroup attribute and render them'

//as  instead of .'

public class DropDownListAdapter : WebControlAdapter

{


    protected override void RenderContents(HtmlTextWriter writer)

    {

        DropDownList list = Control as DropDownList;

        string currentOptionGroup;

        List renderedOptionGroups = new List();


        foreach(ListItem item in list.Items)

        {

            if (item.Attributes["OptionGroup"] != null)

            {

                //'The item is part of an option group'

                currentOptionGroup = item.Attributes["OptionGroup"];

                //'the option header was already written, just render the list item'

                if(renderedOptionGroups.Contains(currentOptionGroup))

                    RenderListItem(item, writer);

                else

                {

                    //the header was not written- do that first'

                    if (renderedOptionGroups.Count > 0)

                        RenderOptionGroupEndTag(writer); //'need to close previous group'

                    RenderOptionGroupBeginTag(currentOptionGroup, writer);

                    renderedOptionGroups.Add(currentOptionGroup);

                    RenderListItem(item, writer);

                }

            }

            else if (item.Text == "--") //simple separator

            {

                RenderOptionGroupBeginTag("--", writer);

                RenderOptionGroupEndTag(writer);

            }

            else

            {

                //default behavior: render the list item as normal'

                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();

    }


}

查看完整回答
反對 回復 2019-11-27
  • 3 回答
  • 0 關注
  • 480 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號