Frage

Ich bin neugierig auf die beste Route (mehr in Richtung Einfachheit suchen, Geschwindigkeit oder Effizienz nicht) ein Dropdownlist in C # / ASP.NET zu sortieren - ich habe ein paar Empfehlungen gesucht, aber sie sind nicht gut mit einem Klick ich.

Edit: Leute, ich habe keine Kontrolle darüber, wie die Daten der Dropdownlist kommt - ich die SQL nicht ändern

.
War es hilfreich?

Lösung

Wenn Sie eine Datentabelle mit den Daten erhalten, können Sie ein Dataview-off von diesem erstellen und dann binden Sie die Dropdown-Liste darauf. Ihr Code wäre so etwas wie ... aussieht

DataView dvOptions = new DataView(DataTableWithOptions);
dvOptions.Sort = "Description";

ddlOptions.DataSource = dvOptions;
ddlOptions.DataTextField = "Description";
ddlOptions.DataValueField = "Id";
ddlOptions.DataBind();

Ihr Textfeld und Wertefeld Optionen auf die entsprechende columnns in der Datentabelle abgebildet werden Sie empfangen.

Andere Tipps

Eine C # Lösung für .NET 3.5 (benötigt System.Linq und 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);
    }

Nennen Sie es, nachdem Sie Ihre Dropdownlist gebunden haben, z.B. OnPreRender:

    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);
        ddlMyDropDown.ReorderAlphabetized();
    }

Halten Sie es in Ihrer Utility-Bibliothek für die einfache Wiederverwendung.

Angenommen, Sie die neueste Version des .Net Framework ausgeführt wird dies funktionieren wird:

List<string> items = GetItemsFromSomewhere();
items.Sort((x, y) => string.Compare(x, y));
DropDownListId.DataSource = items;
DropDownListId.DataBind();

Dropdownlist nimmt jede IEnumerable als Datasource.

Just sortieren es LINQ verwenden.

ich in der Regel ein Dropdownlist mit Werten aus einer Datenbanktabelle laden, so dass der einfachste Weg, um Ihre Ergebnisse zu sortieren, wie mit der ORDER BY-Klausel der SELECT-Anweisung gewünscht, und dann iterieren nur durch die Ergebnisse und steckt sie in die Dropdownlist.

Werfen Sie einen Blick auf die diesem Artikel von Codeproject , die die umlagert Inhalt einer Dropdownlist. Wenn Sie Datenbindung, müssen Sie den Sortierer laufen, nachdem die Daten in die Liste gebunden ist.

Es wird empfohlen, die Daten zu sortieren, bevor sie den Dropdowndatabinding, aber falls Sie sich nicht, das ist, wie Sie die Elemente in der Dropdownlist sortieren würden.

Zuerst müssen Sie einen Vergleich Klasse

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

Dann müssen Sie eine Methode, die diese Comparer verwenden, um die Dropdownlist

sortieren
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

Schließlich rufen Sie diese Funktion mit Ihrer Dropdownlist (nachdem es gewesen ist datengebundene)

SortDropDown(cboMyDropDown)

P. S. Sorry, aber meine Wahl der Sprache ist VB. Sie können http://converter.telerik.com/ den Code von VB zu C # konvertieren

Eine andere Möglichkeit ist es, die Listitems in ein Array und sortieren zu setzen.

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

Ich stimme mit ORDER BY Sortierung, wenn sie mit einer Datenbankabfrage bevölkern, wenn alles, was Sie wollen, ist in alphabetischer Reihenfolge der angezeigten Ergebnisse zu sortieren. Lassen Sie die Datenbank-Engine die Arbeit des Sortierens.

Aber manchmal möchten Sie eine andere Reihenfolge, um neben alphabetisch . Zum Beispiel könnten Sie eine logische Reihenfolge wie wollen: Neu, Öffnen, In Bearbeitung, Abgeschlossen, Genehmigt, geschlossen. In diesem Fall könnten Sie eine Spalte in der Datenbanktabelle hinzufügen explizit die Sortierreihenfolge festzulegen. Nennen Sie es so etwas wie SortOrder oder DisplaySortOrder. Dann in der SQL, würden Sie von der Sortierreihenfolge Feldbestellung (ohne das Feld Abrufen).

Welche Art von Objekt verwenden Sie für die Datenbindung? Normalerweise verwende ich Collection , List oder Queue (abhängig von den Umständen). Diese sind relativ einfach, einen benutzerdefinierten Delegaten zu sortieren verwenden. Siehe MSDN-Dokumentation auf dem Vergleich (T) Delegat .

var list = ddl.Items.Cast<ListItem>().OrderBy(x => x.Text).ToList();

ddl.DataSource = list;
ddl.DataTextField = "Text";
ddl.DataValueField = "Value"; 
ddl.DataBind();

Versuchen Sie es

------- Abspeicherprozedur ----- (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 Klasse ----

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

ich mit den Leuten stimmen Ihre Daten in das Modell in Sortierung, bevor sie auf das Dropdownlist bevölkern, so dass, wenn Sie diese von einem beliebigen DB bevölkern, ist es eine gute Sache, sie schon da zu bekommen sortiert ein einfaches , um mit durch Klausel, wird es einige Zyklen in dem Web-Server speichern, und ich bin sicher, dass die DB es so viel schneller tun. Wenn Sie diese aus einer anderen Datenquelle beispielsweise bevölkern, XML-Datei mithilfe von LINQ wird eine gute Idee sein, oder auch jede Variation von Array.Sort gut sein wird.

Wenn Ihre Daten kommt Ihnen als System.Data.DataTable, die .Select des Datatable () -Methode aufrufen, vorbei in „“ für die Filterexpression und „COLUMN1 ASC“ (oder was auch immer Spalte, die Sie sortieren möchten) für die Art. Dies wird ein Array von DataRow Objekte zurückgeben, sortiert nach Angabe, dass Sie dann durchlaufen kann und Dump in die 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();

Um ein Objekt Datenquelle zu sortieren, die einen Datensatz zurückgibt Sie die Sortieren Eigenschaft der Steuerung.

Beispiel für die Verwendung in der aspx Seite sortieren nach Reihenfolge des Spaltennamen aufsteigend

<asp:ObjectDataSource ID="dsData" runat="server" TableName="Data" 
 Sort="ColumnName ASC" />

ist besser, wenn Sie die Quelle sortieren, bevor es zu DropDwonList Bindung. aber Art DropDownList.Items wie folgt aus:

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

(dieser Fall i sortiert nach einer Zeichenkette (der Text der Artikel), könnte es die suplier Namen, Lieferanten-ID sein)

die Sort() Methode ist für jeden List(of ) / List<MyType>, können Sie es verwenden.

Sie können es auf diese Weise ist einfach

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

}

Und rufen Sie die Methode diese SortDDL (ref yourDropDownList); und das ist es. Die Daten in Ihrer Dropdownlist sortiert sein sollen.

finden Sie unter http: // www .codeproject.com / Artikel / 20131 / Sorting-Dropdown-Liste-in-ASP-NET-using-C #

Sie können mit dieser JavaScript-Funktion:

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

Versuchen Sie folgendes:

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

}

Dies wird mit einem Text einen bestimmten Drop-Down-Liste nehmen und eine Value-Eigenschaft des Listenelements und steckte sie wieder in den gegebenen Dropdown-Liste. Best of Luck!

Wenn Sie Optionen, um die Drop-Down eins nach dem anderen, ohne einen Datensatz hinzufügen, und Sie wollen es sortieren später Gegenstände nach dem Hinzufügen, hier eine Lösung:

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

Dies würde die Drop-down-Elemente in alphabetischer Reihenfolge sortieren.

Wenn Sie eine Daten beschränkte Dropdownlist verwenden, gehen Sie einfach auf den Assistenten und bearbeiten Sie die Begrenzungs Abfrage durch:

  1. Gehe zu der ASPX-Seite (Entwurfsansicht).
  2. Klicken Sie auf den magischen Pfeil ">" auf der Dropdown-Liste.
  3. Wählen Sie „Datenquelle konfigurieren“.
  4. Klicken Sie auf Weiter.
  5. Auf der rechten Seite der geöffneten Fenster klicken Sie auf "ORDER BY ...".
  6. Sie haben auf zwei dort Feld cariteria nach zu sortieren. Wählen Sie das gewünschte Feld und klicken Sie auf OK, dann klicken Sie auf Fertig stellen.

eingeben Bild Beschreibung hier

Sie können keinen Zugriff auf die SQL haben, aber wenn Sie das DataSet oder Datatable haben, können Sie auf jeden Fall die Sort() Methode aufrufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top