我正在开发一个网页,其中展示了从数据库中获取的列表框项。我动态地添加了一些项到它里面。它们会被添加到列表框的末尾,所以我想在添加完项目后对列表框项进行排序。我尝试使用 Arraylist
进行排序,但它没有起作用。
我在寻找一种不需要比较器类、ArrayList等的方法来完成这个任务。所以我想把我已经使用过的方法粘贴出来:
请注意,我的方法使用LINQ to Objects,因此它只能在较新版本的框架中使用。
// 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>());
在您的ListBox
的PreRender
事件中尝试此代码。
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()));
}
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();
DataView dv = dt.DefaultView;
dv.Sort = "val desc";
然后将列表框的数据源设置为dv.ToTable()
在将datatable分配为列表框的数据源之前,您必须对其进行排序。
DataTable.DefaultView.sort = "[Column Name]".
根据您提到的,您正在使用Add方法将ListItems添加到List中,Add方法总是将ListItems附加在末尾。您可以使用Insert方法和索引在所需位置添加项目。List.Insert(ListItem, index)
我知道这与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!
}
希望这对其他人有用。
Private Sub SortList(ByVal lb As DropDownList)
' get a LINQ-enabled list of the list items
Dim list As New List(Of ListItem)(lb.Items.Cast(Of ListItem)())
' use LINQ to Objects to order the items as required
list = list.OrderBy(Function(li) li.Text).ToList()
' remove the unordered items from the listbox, so we don't get duplicates
lb.Items.Clear()
' now add back our sorted items
lb.Items.AddRange(list.ToArray())
End Sub