我很好奇在 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 的 AC# 解决方案(需要 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();
DropDownList 将任何 IEnumerable 作为数据源。
只需使用 LINQ 对其进行排序。
我通常使用数据库表中的值加载 DropDownList,因此最简单的方法是使用 SELECT 语句的 ORDER BY 子句根据需要对结果进行排序,然后遍历结果并将它们转储到 DropDownList 中。
查看CodeProject 中的这篇文章,它重新排列了下拉列表的内容。如果您是数据绑定,则需要在数据绑定到列表后运行排序器。
建议在将数据绑定到 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)
PS 抱歉,我选择的语言是 VB。您可以使用http://converter.telerik.com/将代码从 VB 转换为 C#
另一种选择是将 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();
如果您只想按字母顺序对显示的结果进行排序,我同意在填充数据库查询时使用 ORDER BY 进行排序。让数据库引擎做排序的工作。
但是,有时您需要除字母表之外的其他排序顺序。例如,您可能需要这样的逻辑顺序:新建、打开、进行中、已完成、已批准、已关闭。在这种情况下,您可以向数据库表中添加一列以显式设置排序顺序。将其命名为 SortOrder 或 DisplaySortOrder。然后,在您的 SQL 中,您将按排序顺序字段排序(不检索该字段)。
您使用哪种对象进行数据绑定?通常我使用 Collection<T>、List<T> 或 Queue<T>(取决于具体情况)。使用自定义委托对这些进行排序相对容易。请参阅有关 Comparison(T) delegate 的 MSDN 文档。
var list = ddl.Items.Cast<ListItem>().OrderBy(x => x.Text).ToList();
ddl.DataSource = list;
ddl.DataTextField = "Text";
ddl.DataValueField = "Value";
ddl.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;
}
}
我同意人们在将模型中的数据填充到 DropDownList 之前对它们进行排序,所以如果你从数据库中填充它,最好使用简单的order by子句让它们已经在那里排序,这样可以节省你在网络服务器中的一些周期,我相信数据库会做得更快。如果您从另一个数据源(例如 XML 文件)填充它,则使用 LINQ 将是一个好主意,甚至 Array.Sort 的任何变体都会很好。
如果您的数据以 System.Data.DataTable 的形式提供给您,请调用 DataTable 的 .Select() 方法,为 filterExpression 传入“”,为排序传入“COLUMN1 ASC”(或您想要排序的任何列)。这将返回一个按指定排序的 DataRow 对象数组,然后您可以对其进行迭代并转储到 DropDownList 中。
你可以使用这个 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;
}
}
}
}
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();
要对返回数据集的对象数据源进行排序,请使用控件的Sort属性。
示例用法 在aspx页面中按ColumnName升序排序
<asp:ObjectDataSource ID="dsData" runat="server" TableName="Data"
Sort="ColumnName ASC" />
如果在将 Source 绑定到 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())
(这种情况下我按字符串(商品的文本)排序,它可以是供应商的名称,供应商的 ID)
该Sort()
方法适用于每个List(of )
/ List<MyType>
,您可以使用它。
你可以这样做很简单
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#
试试这个:
/// <summary>
/// AlphabetizeDropDownList alphabetizes a given dropdown list by it's 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);
}
}
}
这将获取一个给定的下拉列表,其中包含列表项的 Text 和 Value 属性,并将它们放回给定的下拉列表中。祝你好运!
如果您在没有数据集的情况下将选项一个一个地添加到下拉列表中,并且您想在添加项目后对其进行排序,这里有一个解决方案:
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();
这将按字母顺序对下拉项目进行排序。
如果您使用的是数据有界 DropDownList,只需转到向导并通过以下方式编辑边界查询:
您可能无法访问 SQL,但如果您有 DataSet 或 DataTable,您当然可以调用该Sort()
方法。