Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Решение С# для .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();
    }

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

Ответ 3

Предполагая, что вы используете последнюю версию .NET Framework, это будет работать:

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

Ответ 9

Я соглашаюсь на сортировку с использованием ORDER BY при заполнении запросом базы данных, если вы хотите только отсортировать отображаемые результаты по алфавиту. Пусть механизм базы данных выполняет сортировку.

Однако иногда вам нужен другой порядок сортировки, кроме алфавитного. Например, вам может понадобиться логическая последовательность, например: "Новый", "Открыть", "Выполняется", "Завершено", "Утверждено", "Закрыто". В этом случае вы можете добавить столбец в таблицу базы данных, чтобы явно задать порядок сортировки. Назовите его что-то вроде SortOrder или DisplaySortOrder. Затем в вашем SQL вы должны ЗАКАЗАТЬ в поле порядка сортировки (без получения этого поля).

Ответ 10

Какой объект вы используете для привязки данных? Обычно я использую Collection <T> , List <T> , или Queue <T> (в зависимости от обстоятельств). Их относительно легко сортировать, используя пользовательский делегат. См. Документация MSDN для делегата сравнения (T).

Ответ 11

Попробуйте

------- Процедура сохранения ----- (SQL)

USE [Your Database]
GO


CRATE PROC [dbo].[GetAllDataByID]

@ID int


AS
BEGIN
        SELECT * FROM Your_Table
        WHERE [email protected]
        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;
        }
    }

Ответ 12

Я согласен с тем, что вы сортируете свои данные в модели до их заполнения в DropDownList, поэтому, если вы заполняете это из БД, это хорошая вещь, чтобы их отсортировать уже там, используя простой порядок по, это сэкономит вам несколько циклов на веб-сервере, и я уверен, что DB сделает это намного быстрее. Если вы заселяете это из другого источника данных, например, файл XML, используя LINQ, будет хорошей идеей или даже любой вариант Array.Sort будет хорошим.

Ответ 13

Если ваши данные поступают к вам как System.Data.DataTable, вызовите метод DataTable.Select(), передав "для выражения фильтра и" COLUMN1 ASC" (или любой другой столбец, который вы хотите отсортировать) для вид. Это вернет массив объектов DataRow, отсортированных как указано, чтобы затем выполнить итерацию и сброс в DropDownList.

Ответ 14

Вы можете использовать эту функцию JavaScript:

function sortlist(mylist)
{
   var lb = document.getElementById(mylist);
   arrTexts = new Array();
   arrValues = new Array();
   arrOldTexts = new Array();

   for(i=0; i<lb.length; i++)
   {
      arrTexts[i] = lb.options[i].text;
      arrValues[i] = lb.options[i].value;

      arrOldTexts[i] = lb.options[i].text;
   }

   arrTexts.sort();

   for(i=0; i<lb.length; i++)
   {
      lb.options[i].text = arrTexts[i];
      for(j=0; j<lb.length; j++)
      {
         if (arrTexts[i] == arrOldTexts[j])
         {
            lb.options[i].value = arrValues[j];
            j = lb.length;
         }
      }
   }
}

Ответ 15

        List<ListItem> li = new List<ListItem>();
        foreach (ListItem list in DropDownList1.Items)
        {
            li.Add(list);
        }
        li.Sort((x, y) => string.Compare(x.Text, y.Text));
        DropDownList1.Items.Clear();
        DropDownList1.DataSource = li;
        DropDownList1.DataTextField = "Text";
        DropDownList1.DataValueField = "Value";
        DropDownList1.DataBind();

Ответ 16

Чтобы отсортировать объект-источник данных, который возвращает набор данных, вы используете свойство Сортировка элемента управления.

Использование примера На странице aspx для сортировки по возрастанию в столбце ColumnName

<asp:ObjectDataSource ID="dsData" runat="server" TableName="Data" 
 Sort="ColumnName ASC" />

Ответ 17

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

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

Ответ 18

лучше, если вы отсортируете источник перед привязкой его к DropDwonList. но сортировать DropDownList.Items вот так:

    Dim Lista_Items = New List(Of ListItem)

    For Each item As ListItem In ddl.Items
        Lista_Items.Add(item)
    Next

    Lista_Items.Sort(Function(x, y) String.Compare(x.Text, y.Text))

    ddl.Items.Clear()
    ddl.Items.AddRange(Lista_Items.ToArray())

(этот случай я сортирую по строке (текст элемента), это может быть имя более высокого уровня, идентификатор поставщика)

Метод Sort() предназначен для каждого List(of )/List<MyType>, вы можете его использовать.

Ответ 19

Вы можете сделать это таким образом, просто

private void SortDDL(ref DropDownList objDDL)
{
ArrayList textList = new ArrayList();
ArrayList valueList = new ArrayList();
foreach (ListItem li in objDDL.Items)
{
    textList.Add(li.Text);
}
textList.Sort();
foreach (object item in textList)
{
    string value = objDDL.Items.FindByText(item.ToString()).Value;
    valueList.Add(value);
}
objDDL.Items.Clear();
for(int i = 0; i < textList.Count; i++)
{
     ListItem objItem = new ListItem(textList[i].ToString(), valueList[i].ToString());
     objDDL.Items.Add(objItem);
}

}

И вызовите метод SortDDL (ref yourDropDownList); и что это. Данные в раскрывающемся списке будут отсортированы.

см. http://www.codeproject.com/Articles/20131/Sorting-Dropdown-list-in-ASP-NET-using-C#

Ответ 20

Попробуйте следующее:

/// <summary>
/// AlphabetizeDropDownList alphabetizes a given dropdown list by it displayed text.
/// </summary>
/// <param name="dropDownList">The drop down list you wish to modify.</param>
/// <remarks></remarks>
private void AlphabetizeDropDownList(ref DropDownList dropDownList)
{
    //Create a datatable to sort the drop down list items
    DataTable machineDescriptionsTable = new DataTable();
    machineDescriptionsTable.Columns.Add("DescriptionCode", typeof(string));
    machineDescriptionsTable.Columns.Add("UnitIDString", typeof(string));
    machineDescriptionsTable.AcceptChanges();
    //Put each of the list items into the datatable
    foreach (ListItem currentDropDownListItem in dropDownList.Items) {
            string currentDropDownUnitIDString = currentDropDownListItem.Value;
            string currentDropDownDescriptionCode = currentDropDownListItem.Text;
            DataRow currentDropDownDataRow = machineDescriptionsTable.NewRow();
            currentDropDownDataRow["DescriptionCode"] = currentDropDownDescriptionCode.Trim();
            currentDropDownDataRow["UnitIDString"] = currentDropDownUnitIDString.Trim();
            machineDescriptionsTable.Rows.Add(currentDropDownDataRow);
            machineDescriptionsTable.AcceptChanges();
    }
    //Sort the data table by description
    DataView sortedView = new DataView(machineDescriptionsTable);
    sortedView.Sort = "DescriptionCode";
    machineDescriptionsTable = sortedView.ToTable();
    //Clear the items in the original dropdown list
    dropDownList.Items.Clear();
    //Create a dummy list item at the top
    ListItem dummyListItem = new ListItem(" ", "-1");
    dropDownList.Items.Add(dummyListItem);
    //Begin transferring over the items alphabetically from the copy to the intended drop
     downlist
    foreach (DataRow currentDataRow in machineDescriptionsTable.Rows) {
            string currentDropDownValue = currentDataRow["UnitIDString"].ToString().Trim();
            string currentDropDownText = currentDataRow["DescriptionCode"].ToString().Trim();
            ListItem currentDropDownListItem = new ListItem(currentDropDownText, currentDropDownValue);
    //Don't deal with dummy values in the list we are transferring over
    if (!string.IsNullOrEmpty(currentDropDownText.Trim())) {
        dropDownList.Items.Add(currentDropDownListItem);
    }
}

}

Это приведет к выпадающему списку с атрибутом "Текст" и "Значение" элемента списка и вернет их в указанный выпадающий список. Лучшее из удачи!

Ответ 21

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

DataTable dtOptions = new DataTable();
DataColumn[] dcColumns = { new DataColumn("Text", Type.GetType("System.String")), 
                           new DataColumn("Value", Type.GetType("System.String"))};
dtOptions.Columns.AddRange(dcColumns);
foreach (ListItem li in ddlOperation.Items)
{
   DataRow dr = dtOptions.NewRow();
   dr["Text"] = li.Text;
   dr["Value"] = li.Value;
   dtOptions.Rows.Add(dr);
}
DataView dv = dtOptions.DefaultView;
dv.Sort = "Text";
ddlOperation.Items.Clear();
ddlOperation.DataSource = dv;
ddlOperation.DataTextField = "Text";
ddlOperation.DataValueField = "Value";
ddlOperation.DataBind();

Это приведет к сортировке выпадающих элементов в алфавитном порядке.

Ответ 22

Если вы используете ограниченный данными DropDownList, просто перейдите к мастеру и отредактируйте ограничивающий запрос:

  • Перейти на страницу .aspx(дизайн).
  • В раскрывающемся списке выберите волшебную стрелку " > ".
  • Выберите "Настроить источник данных".
  • Нажмите "Далее".
  • В правой части открытого окна нажмите "ORDER BY...".
  • У вас будет два полевых катеритера для сортировки. Выберите нужное поле и нажмите "ОК", затем нажмите "Готово".

enter image description here

Ответ 23

У вас может не быть доступа к SQL, но если у вас есть DataSet или DataTable, вы можете, конечно, вызвать метод Sort().