我很好奇关于在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();

DropDownList将任何IEnumerable作为DataSource。

使用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)

P.S。抱歉,我选择的语言是VB。您可以使用 http://converter.telerik.com/ 将代码从VB转换为C#

另一种选择是将ListItem放入数组并进行排序。

        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进行排序,如果您只想按字母顺序对显示的结果进行排序。让数据库引擎完成排序工作。

但是,有时您需要除字母之外的其他排序顺序。例如,您可能需要一个逻辑序列,如:New,Open,In Progress,Completed,Approved,Closed。在这种情况下,您可以向数据库表中添加一列以显式设置排序顺序。将其命名为SortOrder或DisplaySortOrder。然后,在SQL中,您将按排序顺序字段进行排序(不检索该字段)。

您使用什么样的对象进行数据绑定?通常我使用Collection <!> lt; T <!> gt ;, List <!> lt; T <!> gt;或Queue <!> lt; T <!> gt; (视情况而定)。使用自定义委托排序相对容易。请参阅有关比较(T)代表的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 Helper Class ----

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之前对模型中的数据进行排序,所以如果你从数据库填充这个数据,那么使用简单的顺序对它们进行排序是一件好事。通过子句,它将在Web服务器中节省一些周期,我相信数据库将更快地完成它。 如果你从另一个数据源填充这个,例如XML文件,使用LINQ将是一个好主意,甚至Array.Sort的任何变体都将是好的。

如果您的数据是作为System.Data.DataTable发送给您的,请调用DataTable的.Select()方法,传入<!> quot; <!> quot;对于filterExpression和<!> quot; COLUMN1 ASC <!> quot; (或者您想要排序的任何列)进行排序。这将返回一个DataRow对象数组,按指定的顺序排序,然后您可以迭代并转储到DropDownList中。

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

要对返回数据集的对象数据源进行排序,请使用控件的排序属性。

示例用法在aspx页面中按ColumnName的升序排序

<asp:ObjectDataSource ID="dsData" runat="server" TableName="Data" 
 Sort="ColumnName ASC" />
如果在将Source绑定到DropDwonList之前对Source进行排序,则

会更好。 但是像这样对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 /文章/ 20131 /排序-下拉一览中-ASP-NET-使用-C#

您可以使用此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;
         }
      }
   }
}

试试这个:

/// <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,只需转到向导并通过以下方式编辑边界查询:

  1. 转到.aspx页面(设计视图)。
  2. 点击下拉列表中的魔术箭头<!>“<!> gt; <!>”。
  3. 选择<!>“;配置数据源<!>”;。
  4. 单击“下一步”。
  5. 在打开的窗口的右侧,单击<!>“; ORDER BY ... <!>”。
  6. 你将有两个野外cariteria排序。选择所需的字段,然后单击“确定”,再单击“完成”。

您可能无权访问SQL,但如果您拥有DataSet或DataTable,则可以使用Sort()方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top