web-dev-qa-db-fra.com

Trier une liste déroulante? - C #, ASP.NET

Je suis curieux de savoir quel est le meilleur itinéraire (plus de simplicité, pas de rapidité ni d’efficacité) pour trier une liste déroulante dans C #/ASP.NET - j’ai déjà consulté quelques recommandations mais elles ne cliquent pas bien avec moi.

Edit: Mes amis, je n'ai pas le contrôle sur la manière dont les données entrent dans DropDownList - je ne peux pas modifier le code SQL.

32
scrot

Si vous obtenez un DataTable avec les données, vous pouvez créer un DataView et lier la liste déroulante à cela. Votre code ressemblerait à quelque chose comme ...

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

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

Les options de votre champ de texte et de votre champ de valeur sont associées aux colonnes appropriées de la table de données que vous recevez.

23
Dillie-O

Une solution C # pour .NET 3.5 (nécessite System.Linq et 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);
    }

Appelez-le après avoir lié votre liste déroulante, par exemple OnPreRender:

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

Collez-le dans votre bibliothèque d’utilitaires pour pouvoir le réutiliser facilement.

20
James McCormack

Si vous utilisez la dernière version du .Net Framework, cela fonctionnera: 

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

DropDownList prend n'importe quel IEnumerable en tant que source de données. 

Il suffit de trier à l'aide de LINQ.

11
Jim

Je charge habituellement une liste DropDownList avec les valeurs d'une table de base de données. Le moyen le plus simple est donc de trier vos résultats à l'aide de la clause ORDER BY de votre instruction SELECT, puis de simplement parcourir les résultats et de les transférer dans la liste DropDownList.

4
MusiGenesis

Jetez un coup d'œil au cet article de CodeProject , qui réorganise le contenu d'une liste déroulante. Si vous êtes en liaison de données, vous devrez exécuter le trieur une fois les données liées à la liste.

2
Samuel Kim

Une autre option consiste à placer les ListItems dans un tableau et à les trier. 

        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();
2
Tony Anderson

Il est recommandé de trier les données avant de les lier à DropDownList, mais dans le cas contraire, procédez comme suit pour trier les éléments de la liste.

D'abord vous avez besoin d'un cours de comparaison

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

Ensuite, vous avez besoin d’une méthode qui utilisera cette comparaison pour trier 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

Enfin, appelez cette fonction avec votre DropDownList (après qu’il ait été databound)

SortDropDown(cboMyDropDown)

P.S. Désolé, mais mon choix de langue est VB. Vous pouvez utiliser http://converter.telerik.com/ pour convertir le code de VB en C #.

2
Dejan

L'essayer

------- Procédure de stockage ----- (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();

            }
        }

------- Classe d'assistance 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;
        }
    }
1
Htun Thein Win

Quel type d'objet utilisez-vous pour la liaison de données? J'utilise généralement Collection <T>, Liste <T> ou File d'attente <T> (selon les circonstances). Celles-ci sont relativement faciles à trier à l'aide d'un délégué personnalisé. Voir Documentation MSDN sur le délégué Comparaison (T) .

1
sfuqua

Je suis d'accord avec le tri en utilisant ORDER BY lors du remplissage avec une requête de base de données, si tout ce que vous voulez, c'est de trier les résultats affichés par ordre alphabétique. Laissez le moteur de base de données effectuer le tri.

Cependant, vous voulez parfois un ordre de tri autre que alphabétique . Par exemple, vous pouvez souhaiter une séquence logique telle que: Nouveau, Ouvrir, En cours, Terminé, Approuvé, Fermé. Dans ce cas, vous pouvez ajouter une colonne à la table de base de données pour définir explicitement l'ordre de tri. Nommez-le quelque chose comme SortOrder ou DisplaySortOrder. Ensuite, dans votre code SQL, vous ordonneriez ORDER BY le champ d'ordre de tri (sans récupérer ce champ). 

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

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

Vous pouvez utiliser cette fonction 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;
         }
      }
   }
}
0
Mrutyunjay

Si vos données vous parviennent en tant que System.Data.DataTable, appelez la méthode .Select () de DataTable, en transmettant "" pour filterExpression et "COLUMN1 ASC" (ou la colonne avec laquelle vous souhaitez trier). Cela renverra un tableau d'objets DataRow, triés comme spécifié, que vous pourrez ensuite parcourir et dump dans DropDownList.

0
MusiGenesis

est préférable si vous triez la source avant de la lier à DropDwonList . mais triez DropDownList.Items comme ceci:

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

(Dans ce cas, je trie une chaîne (le texte de l'article), ce pourrait être le nom du fournisseur, l'identifiant du fournisseur)

la méthode Sort() est pour chaque List(of )/List<MyType>, vous pouvez l'utiliser.

0
Logar314159

Je suis d'accord avec les utilisateurs pour trier vos données dans le modèle avant de les renseigner dans DropDownList. Par conséquent, si vous remplissez ces informations à partir d'une base de données, il est judicieux de les avoir déjà triées à l'aide d'une simple clause order by , cela vous épargnera quelques cycles sur le serveur Web, et je suis sûr que la base de données le fera beaucoup plus rapidement . Si vous le remplissez à partir d’une autre source de données, par exemple un fichier XML, en utilisant LINQ, ce serait une bonne idée. , ou même toute variante de Array.Sort, ce sera bien.

0
bashmohandes

Si vous ajoutez des options au menu déroulant une par une sans ensemble de données et que vous souhaitez les trier ultérieurement après l'ajout d'éléments, voici une solution:

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

Cela permettrait de trier les éléments de la liste déroulante par ordre alphabétique.

0
n00b

Essaye ça:

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

}

Cela prend une liste déroulante donnée avec une propriété Text et une valeur de l'élément de liste et les replace dans la liste déroulante donnée . Best of Luck!

0
Vince Pike

Si vous utilisez une liste DropDownList liée aux données, accédez à l'assistant et modifiez la requête associée en:

  1. Allez à la page .aspx (mode Création).
  2. Cliquez sur la flèche magique ">" dans la liste déroulante.
  3. Sélectionnez "Configurer la source de données". 
  4. Cliquez sur Suivant.
  5. Sur le côté droit de la fenêtre ouverte, cliquez sur "ORDER BY ...".
  6. Vous aurez à trier deux champs de recherche sur le terrain. Sélectionnez le champ souhaité et cliquez sur OK, puis sur Terminer.

enter image description here

0
Zag

Vous pouvez le faire de cette façon est simple

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

}

Et appelez la méthode ce SortDDL (réf yourDropDownList); Et c'est tout. Les données de votre liste déroulante seront triées.

voir http://www.codeproject.com/Articles/20131/Sorting-Dropdown-list-in-ASP-NET-using-C#

0
Mac Chibueze

Pour trier une source de données d'objet qui renvoie un ensemble de données, utilisez la propriété Sort du contrôle. 

Exemple d'utilisation Dans la page aspx à trier par ordre croissant de ColumnName 

<asp:ObjectDataSource ID="dsData" runat="server" TableName="Data" 
 Sort="ColumnName ASC" />
0
mikek3332002
        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();
0
Randy