2009-11-05 2 views
7

Я разрабатываю веб-страницу, в которой отображаются элементы списка, которые извлекаются из базы данных. Динамически я добавил в него некоторые элементы. Он добавляет в конец окна списка, поэтому я хочу отсортировать элемент списка после добавления элементов. Я попробовал Arraylist для сортировки, но он не работает.Сортировка элементов списка в C#

+5

Было бы более удобно сортировать список ** перед добавлением элементов в список. –

+0

Но когда я добавляю элементы, которые они добавляют, наконец. Но мне нужно это в соответствующем месте. – Sakthivel

+1

Почему бы не вставить некоторый пример кода ... – RichardOD

ответ

0

Вы хотите сказать, что вы добавляете элементы в список через Javascript или после отправки сообщения somekind с помощью элементов управления ASP.NET?

Если вы добавляете динамически с помощью Javascript, тогда ваш ответ будет сортироваться с помощью jQuery, и если после обратной передачи с использованием ASP.NET вы должны использовать объект List, расположенный в System.Collections.Generic.

+0

Привет, Евгений, он сказал, что использовал Arraylist для сортировки ... Поэтому я полагаю, что он делает на стороне сервера. Но теперь я сомневаюсь, у нас есть arraylist в javascript или в JQuery? –

1

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

DataTable dt = new DataTable(); 
      dt.Columns.Add("val", Type.GetType("System.Int32")); 
      DataRow dr; 
      for (int i = 1; i <= 31; i++) 
      { 
       dr = dt.NewRow(); 
       dr[0] = i; 
       dt.Rows.Add(dr); 
      } 
      dt.AcceptChanges(); 
      DataView dv = dt.DefaultView; 
      dv.Sort = "val desc"; 
      ddlDay.DataTextField = "val"; 
      ddlDay.DataValueField = "val"; 
      ddlDay.DataSource = dv.ToTable(); 
      ddlDay.DataBind(); 

Если ур связывания ListBox, установив источник данных как DataTable заполняется БД данных, то, если вы хотите добавить новый элемент вместо добавления элемента добавить запись к DataTable , Затем создайте DataView для этого DataTable, сортировать данные в DataView, как показано ниже:

DataView dv = dt.DefaultView; 
       dv.Sort = "val desc"; 

затем установите источник данных из выпадающего списка, как dv.ToTable()

+0

Я не могу понять, что вы сделали здесь – Sakthivel

1

Вы должны сортировать DataTable перед назначением в качестве источника данных в списке ,

DataTable.DefaultView.sort = "[Column Name]".

Как вы упомянули, вы используете метод Add для добавления ListItems в List, метод Add всегда добавляет ListItems. Вы можете добавить элементы по желаемому индексу, используя метод Insert с индексом. List.Insert (ListItem, индекс)

Приветствия

+0

Но как он может сортировать список? – Sakthivel

+0

после того, как вы сделали то, что сказал Zinx, Bind List to DropDownList ... Так же, if (! IsPostback) { MyDropDownList.DataSource = ModifiedArrayList; MyDropDownList.Databind();} – eugeneK

3

Попробуйте этот код в PreRender случае вашей ListBox.

System.Collections.SortedList sorted = new SortedList(); 

foreach (ListItem ll in ListBox1.Items) 
{ 
    sorted.Add(ll.Text, ll.Value); 
} 

ListBox1.Items.Clear(); 

foreach (String key in sorted.Keys) 
{ 
    ListBox1.Items.Add(new ListItem(key, sorted[key].ToString())); 
} 
+0

Вы легенда! Остановил, что я трачу на 4 часа больше, чем мне нужно! – Fandango68

22

Я знаю, этот вопрос довольно старый, но я смотрел на способе сделать это без классов компаратора ArrayLists и т.д. Так что я думал, что наклеить метод я использовал для других:

Обратите внимание что мой метод использует LINQ to Objects, поэтому он будет работать только в более новых версиях Framework.

// get a LINQ-enabled list of the list items 
List<ListItem> list = new List<ListItem>(ListBoxToSort.Items.Cast<ListItem>()); 
// use LINQ to Objects to order the items as required 
list = list.OrderBy(li => li.Text).ToList<ListItem>(); 
// remove the unordered items from the listbox, so we don't get duplicates 
ListBoxToSort.Items.Clear(); 
// now add back our sorted items 
ListBoxToSort.Items.AddRange(list.ToArray<ListItem>()); 
+0

Как это работает в VB.NET? И ваш код не уничтожает все значения, как в этом примере: http://www.devcurry.com/2009/07/sort-items-in-aspnet-dropdownlist-using.html Спасибо! – Flo

+0

Нет, в первой строке, где я прочитал объекты ListItem, я сохраняю ссылку на них в переменной «list». Поэтому, когда список очищается, те же самые элементы снова добавляются обратно, в другом порядке. Мой VB.NET очень ржавый, но, видя, как я использую синтаксис метода LINQ, я бы подумал, что вы можете сделать одни и те же вызовы аналогичным образом. Просто не забудьте включить (импортировать) библиотеку System.Linq. –

+0

Бесполезно, кроме VS2010 и далее – Fandango68

0

Вот VB код Private Sub список сортировки (ByVal фунтов Как DropDownList) 'получить LINQ с поддержкой списка элементов списка список Dim As New List (Of ListItem) (lb.Items.Cast (Of ListItem)()) 'использует LINQ to Objects для упорядочивания элементов по мере необходимости list = list.OrderBy (Function (li) li.Text) .ToList() ' удаляет неупорядоченные элементы из списка, поэтому мы не получайте дубликаты lb.Items.Clear() 'сейчас добавьте назад наши отсортированные элементы lb.Items.AddRange (list.ToArray()) End Sub

0

Я знаю, что это очень похоже на ответ The King, но так оно и было для меня.

System.Collections.SortedList sorted = new System.Collections.SortedList(); 

foreach (ListItem ll in ListInQuestion.Items) 
{ 
    sorted.Add(ll.Value, ll.Text);//yes, first value, then text 
} 

ListInQuestion.Items.Clear(); 

foreach (String key in sorted.Keys) 
{ 
    ListInQuestion.Items.Add(new ListItem(sorted[key].ToString(), key));// <-- look here! 
} 

Надеюсь, это сработает для кого-то еще.

Смежные вопросы