如何对下拉列表进行排序? - C#,ASP.NET

36

我很好奇在C#/ASP.NET中对DropDownList进行排序的最佳方法(更注重简单性而非速度或效率)- 我已经查看了一些建议,但它们并不适合我。

编辑:各位,我无法控制数据如何进入DropDownList - 我无法修改SQL。


你是想在服务器端还是客户端对列表进行排序?如果是在服务器端,你将使用什么类型的数据源? - Kevin Dostalek
客户端。我无法控制数据如何进入DDL。 - scrot
所以显然我无法控制这个 SQL 语句。 - scrot
如果您的数据以 DataTable(或 DataSet)的形式传递给您,下面的答案应该适用于您。DataTable 的内置排序功能有点隐藏。 - MusiGenesis
可能是https://dev59.com/TXRB5IYBdhLWcg3wSVm1的重复问题。 - immutabl
23个回答

27
如果你有一个包含数据的DataTable,你可以创建一个DataView,并将下拉列表绑定到它。你的代码应该类似于...

如果您拥有带有数据的DataTable,则可以创建一个DataView并将下拉列表绑定到该视图。您的代码将类似于...

DataView dvOptions = new DataView(DataTableWithOptions);
dvOptions.Sort = "Description";

ddlOptions.DataSource = dvOptions;
ddlOptions.DataTextField = "Description";
ddlOptions.DataValueField = "Id";
ddlOptions.DataBind();

您的文本字段和值字段选项已映射到接收到的数据表中的相应列。


22

一个适用于.NET 3.5的C#解决方案(需要使用System.Linq和System.Web.UI):

    public static void ReorderAlphabetized(this DropDownList ddl)
    {
        List<ListItem> listCopy = new List<ListItem>();
        foreach (ListItem item in ddl.Items)
            listCopy.Add(item);
        ddl.Items.Clear();
        foreach (ListItem item in listCopy.OrderBy(item => item.Text))
            ddl.Items.Add(item);
    }

在绑定下拉列表之后调用它,例如在OnPreRender中:

    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);
        ddlMyDropDown.ReorderAlphabetized();
    }

将其放入您的实用库以便于重复使用。


Dim items = (From item In ddl.Items.Cast(Of ListItem)() Order By item.Text Select item).ToArray ddl.Items.Clear() ddl.Items.AddRange(items) 将下拉列表框中的项按文本排序,然后将其转换为数组并存储在变量items中。 清除下拉列表框中的所有项。 将已排序的项添加回下拉列表框中。 - leqid

17

假设您正在运行最新版本的 .Net Framework,这将会工作:

List<string> items = GetItemsFromSomewhere();
items.Sort((x, y) => string.Compare(x, y));
DropDownListId.DataSource = items;
DropDownListId.DataBind();

1
items.Sort((x, y) => string.Compare(x, y)); 中,xy 是什么? - Jogi

11

DropDownList将任何IEnumerable作为数据源。

只需使用LINQ进行排序即可。


5

我通常从数据库表中加载下拉列表的值,所以最简单的方法是使用SELECT语句的ORDER BY子句按照需要排序结果,然后只需遍历结果并将它们转储到下拉列表中即可。


5
OP 表示他无法修改用于填充此下拉菜单的 SQL。 - DKATDT
这个答案正是我所需要的,虽然我不得不费些功夫来理解你的意思。当你配置数据源时,不要使用“从表中指定列”,而要使用“指定自定义 SQL 语句或存储过程”,然后我的 SQL 会类似于这样:“SELECT OrgTable.* FROM OrgAuthentication ORDER BY OrgName”。 - user5419026

2

在将数据绑定到DropDownList之前,建议对数据进行排序,但如果您无法这样做,则可以按照以下方式对DropDownList中的项目进行排序。

首先,您需要一个比较类。

Public Class ListItemComparer
    Implements IComparer(Of ListItem)

    Public Function Compare(ByVal x As ListItem, ByVal y As ListItem) As Integer _
        Implements IComparer(Of ListItem).Compare

        Dim c As New CaseInsensitiveComparer
        Return c.Compare(x.Text, y.Text)
    End Function
End Class

然后您需要一个使用此比较器对DropDownList进行排序的方法。

Public Shared Sub SortDropDown(ByVal cbo As DropDownList)
    Dim lstListItems As New List(Of ListItem)
    For Each li As ListItem In cbo.Items
        lstListItems.Add(li)
    Next
    lstListItems.Sort(New ListItemComparer)
    cbo.Items.Clear()
    cbo.Items.AddRange(lstListItems.ToArray)
End Sub

最后,在你的DropDownList被数据绑定之后,调用这个函数。
SortDropDown(cboMyDropDown)

抱歉,但我选择的语言是VB。您可以使用http://converter.telerik.com/将代码从VB转换为C#。


2
另一个选项是将ListItems放入数组中并进行排序。
        int i = 0;
        string[] array = new string[items.Count];

        foreach (ListItem li in dropdownlist.items)
        {
            array[i] = li.ToString();
            i++;

        }

        Array.Sort(array);

        dropdownlist.DataSource = array;
        dropdownlist.DataBind();

2
请看CodeProject的此篇文章,它可以重新排列下拉列表的内容。如果您正在进行数据绑定,您需要在数据绑定到列表后运行排序器。

1

试一下

-------存储过程-----(SQL)

USE [Your Database]
GO


CRATE PROC [dbo].[GetAllDataByID]

@ID int


AS
BEGIN
        SELECT * FROM Your_Table
        WHERE ID=@ID
        ORDER BY Your_ColumnName 
END

----------Default.aspx---------

<asp:DropDownList ID="ddlYourTable" runat="server"></asp:DropDownList>

---------Default.aspx.cs-------

protected void Page_Load(object sender, EventArgs e)

{

      if (!IsPostBack)
            {
                List<YourTable> table= new List<YourTable>();

                YourtableRepository tableRepo = new YourtableRepository();

                int conuntryInfoID=1;

                table= tableRepo.GetAllDataByID(ID);

                ddlYourTable.DataSource = stateInfo;
                ddlYourTable.DataTextField = "Your_ColumnName";
                ddlYourTable.DataValueField = "ID";
                ddlYourTable.DataBind();

            }
        }

-------LINQ帮助类----

public class TableRepository

   {

        string connstr;

        public TableRepository() 
        {
            connstr = Settings.Default.YourTableConnectionString.ToString();
        }

        public List<YourTable> GetAllDataByID(int ID)
        {
            List<YourTable> table= new List<YourTable>();
            using (YourTableDBDataContext dc = new YourTableDBDataContext ())
            {
                table= dc.GetAllDataByID(ID).ToList();
            }
            return table;
        }
    }

1
var list = ddl.Items.Cast<ListItem>().OrderBy(x => x.Text).ToList();

ddl.DataSource = list;
ddl.DataTextField = "Text";
ddl.DataValueField = "Value"; 
ddl.DataBind();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接