如何在ListBox中按字母顺序插入项目?

11

我正在开发一个网页,其中展示了从数据库中获取的列表框项。我动态地添加了一些项到它里面。它们会被添加到列表框的末尾,所以我想在添加完项目后对列表框项进行排序。我尝试使用 Arraylist 进行排序,但它没有起作用。


5
将列表中的项添加到列表框之前进行排序将更加高效。 - Winston Smith
1
但是当我添加项目时,它会附加在最后。但我需要它放在适当的位置。 - Sakthivel
7个回答

24

我在寻找一种不需要比较器类、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>());

不,在第一行中,当我读取ListItem对象时,我将它们的引用保持在“list”变量中。因此,当清除列表时,同样的项目之后会以不同的顺序添加回来。我的VB.NET已经很生疏了,但是看到我正在使用LINQ方法语法,我认为你可以以类似的方式进行相同的调用。只需记得包括(导入)System.Linq库即可。 - Carl Heinrich Hancke

4

在您的ListBoxPreRender事件中尝试此代码。

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()));
}

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();

如果您正在通过将数据源设置为使用数据库数据填充的DataTable来绑定listbox,则在想要添加新项而不是添加该项时,请将记录添加到datatable中。然后,为该datatable创建一个dataview,并按以下方式对dataview中的数据进行排序:
DataView dv = dt.DefaultView;
                dv.Sort = "val desc";

然后将列表框的数据源设置为dv.ToTable()


0

在将datatable分配为列表框的数据源之前,您必须对其进行排序。

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

根据您提到的,您正在使用Add方法将ListItems添加到List中,Add方法总是将ListItems附加在末尾。您可以使用Insert方法和索引在所需位置添加项目。List.Insert(ListItem, index)


但它如何对列表框进行排序? - Sakthivel
在执行Zinx所说的操作后,将列表绑定到下拉列表中... 代码如下: if(!isPostback){ MyDropDownList.DataSource = ModifiedArrayList; MyDropDownList.Databind();} - eugeneK

-1

我知道这与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!
}

希望这对其他人有用。


为什么要交换国王答案中的两个参数? - TylerH

-1
你所说的动态添加是指通过Javascript添加列表项,还是在使用ASP.NET控件进行某种后台提交之后添加?
如果是通过Javascript动态添加,则你的答案应该是使用jQuery进行排序;如果是在ASP.NET后台提交后添加,则应该使用位于System.Collections.Generic命名空间下的List对象。

嗨eugeneK,他说他使用ArrayList进行排序...所以我认为他是在服务器端进行的。但现在我怀疑,在JavaScript或JQuery中是否有ArrayList? - The King

-1
这是VB代码。
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

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