我很好奇在C#/ASP.NET中对DropDownList进行排序的最佳方法(更注重简单性而非速度或效率)- 我已经查看了一些建议,但它们并不适合我。
编辑:各位,我无法控制数据如何进入DropDownList - 我无法修改SQL。
我很好奇在C#/ASP.NET中对DropDownList进行排序的最佳方法(更注重简单性而非速度或效率)- 我已经查看了一些建议,但它们并不适合我。
编辑:各位,我无法控制数据如何进入DropDownList - 我无法修改SQL。
如果您拥有带有数据的DataTable,则可以创建一个DataView并将下拉列表绑定到该视图。您的代码将类似于...
DataView dvOptions = new DataView(DataTableWithOptions);
dvOptions.Sort = "Description";
ddlOptions.DataSource = dvOptions;
ddlOptions.DataTextField = "Description";
ddlOptions.DataValueField = "Id";
ddlOptions.DataBind();
您的文本字段和值字段选项已映射到接收到的数据表中的相应列。
一个适用于.NET 3.5的C#解决方案(需要使用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();
}
将其放入您的实用库以便于重复使用。
假设您正在运行最新版本的 .Net Framework,这将会工作:
List<string> items = GetItemsFromSomewhere();
items.Sort((x, y) => string.Compare(x, y));
DropDownListId.DataSource = items;
DropDownListId.DataBind();
items.Sort((x, y) => string.Compare(x, y));
中,x
和 y
是什么? - JogiDropDownList将任何IEnumerable作为数据源。
只需使用LINQ进行排序即可。
我通常从数据库表中加载下拉列表的值,所以最简单的方法是使用SELECT语句的ORDER BY子句按照需要排序结果,然后只需遍历结果并将它们转储到下拉列表中即可。
在将数据绑定到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
然后您需要一个使用此比较器对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
SortDropDown(cboMyDropDown)
抱歉,但我选择的语言是VB。您可以使用http://converter.telerik.com/将代码从VB转换为C#。
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();
试一下
-------存储过程-----(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帮助类----
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;
}
}
var list = ddl.Items.Cast<ListItem>().OrderBy(x => x.Text).ToList();
ddl.DataSource = list;
ddl.DataTextField = "Text";
ddl.DataValueField = "Value";
ddl.DataBind();