Сортировка DropDownList? - C #, ASP.NET - PullRequest
       100

Сортировка DropDownList? - C #, ASP.NET

32 голосов
/ 21 октября 2008

Мне любопытно узнать, как лучше всего (больше обращать внимание на простоту, а не скорость или эффективность) для сортировки DropDownList в C # / ASP.NET - я посмотрел несколько рекомендаций, но они плохо работают с я.

Редактировать: Люди, у меня нет контроля над тем, как данные попадают в DropDownList - я не могу изменить SQL.

Ответы [ 23 ]

23 голосов
/ 23 октября 2008

Если вы получаете DataTable с данными, вы можете создать из этого DataView и затем связать с ним выпадающий список. Ваш код будет выглядеть примерно так ...

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

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

Ваше текстовое поле и параметры поля значений сопоставлены с соответствующими столбцами в таблице данных, которую вы получаете.

20 голосов
/ 12 марта 2010

Решение C # для .NET 3.5 (требуются 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();
    }

Вставьте его в свою служебную библиотеку для легкого повторного использования.

16 голосов
/ 23 октября 2008

Если вы используете последнюю версию .Net Framework, это будет работать:

List<string> items = GetItemsFromSomewhere();
items.Sort((x, y) => string.Compare(x, y));
DropDownListId.DataSource = items;
DropDownListId.DataBind();
11 голосов
/ 21 октября 2008

DropDownList принимает любой IEnumerable в качестве источника данных.

Просто отсортируйте его с помощью LINQ.

4 голосов
/ 21 октября 2008

Обычно я загружаю DropDownList со значениями из таблицы базы данных, поэтому самый простой способ - отсортировать результаты по своему усмотрению с помощью предложения ORDER BY вашего оператора SELECT, а затем просто выполнить итерацию результатов и вывести их в DropDownList.

2 голосов
/ 22 октября 2008

Взгляните на эту статью из CodeProject , которая переупорядочивает содержимое выпадающего списка. Если вы привязываете данные, вам нужно будет запустить сортировщик после привязки данных к списку.

2 голосов
/ 15 декабря 2009

Рекомендуется отсортировать данные перед привязкой их к 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

Тогда вам нужен метод, который будет использовать этот Comparer для сортировки 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)

P.S. Извините, но я выбираю язык VB. Вы можете использовать http://converter.telerik.com/ для преобразования кода из VB в C #

2 голосов
/ 31 июля 2012

Другой вариант - поместить 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();
1 голос
/ 15 января 2014

Попробуйте

------- Процедура сохранения ----- (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 Helper ----

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 голос
/ 28 февраля 2013
var list = ddl.Items.Cast<ListItem>().OrderBy(x => x.Text).ToList();

ddl.DataSource = list;
ddl.DataTextField = "Text";
ddl.DataValueField = "Value"; 
ddl.DataBind();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...