2009-11-05 16 views
7

Sviluppo una pagina Web in cui visualizzo una casella di riepilogo che viene recuperata da un database. Dinamicamente ho aggiunto alcuni elementi in esso. Si aggiunge alla fine della casella di riepilogo, quindi desidero ordinare l'elemento della casella di riepilogo dopo aver aggiunto gli elementi. Ho provato Arraylist per l'ordinamento, ma non funziona.Ordina gli elementi della casella di riepilogo in C#

+5

Sarebbe più efficiente ordinare l'elenco ** prima ** aggiungendo gli elementi alla casella di riepilogo. –

+0

Ma quando aggiungo finalmente gli elementi che aggiunge. Ma ho bisogno di un posto appropriato. – Sakthivel

+1

Perché non incolla il codice di esempio ... – RichardOD

risposta

0

Intendi in modo dinamico che aggiungi elementi all'elenco tramite Javascript o dopo il postback di qualche tipo utilizzando i controlli ASP.NET?

Se si aggiunge dinamicamente tramite Javascript, la risposta sarà l'ordinamento con jQuery e se dopo il postback si utilizza ASP.NET, è necessario utilizzare l'oggetto Elenco ubicato in System.Collections.Generic.

+0

Ciao eugeneK, Ha detto che ha usato l'Arrayylist per l'ordinamento ... Quindi presumo che stia facendo al server. Ma ora dubito, abbiamo arraylist in javascript o in JQuery? –

1

provare il seguente codice:

DataTable dt = new DataTable(); 
      dt.Columns.Add("val", Type.GetType("System.Int32")); 
      DataRow dr; 
      for (int i = 1; i <= 31; i++) 
      { 
       dr = dt.NewRow(); 
       dr[0] = i; 
       dt.Rows.Add(dr); 
      } 
      dt.AcceptChanges(); 
      DataView dv = dt.DefaultView; 
      dv.Sort = "val desc"; 
      ddlDay.DataTextField = "val"; 
      ddlDay.DataValueField = "val"; 
      ddlDay.DataSource = dv.ToTable(); 
      ddlDay.DataBind(); 

Se ur vincolante casella di riepilogo impostando origine dati come DataTable popolato con i dati db poi quando si desidera aggiungere un nuovo elemento invece di aggiungere la voce di aggiungere il record alla datatable . Quindi creare un dataview per questo DataTable, ordinare i dati del dataview come di seguito:

DataView dv = dt.DefaultView; 
       dv.Sort = "val desc"; 

quindi impostare il DataSource del listbox come dv.ToTable()

+0

Non riesco a capire cosa hai fatto qui – Sakthivel

1

Dovete ordinare DataTable prima di assegnare come origine dati alla casella di riepilogo .

DataTable.DefaultView.sort = "[Nome colonna]".

Come hai detto che stai usando il metodo Aggiungi per aggiungere ListItems in List, il metodo Add aggiunge sempre ListItems. È possibile aggiungere elementi all'indice desiderato utilizzando il metodo Insert con indice. List.Insert (ListItem, index)

Acclamazioni

+0

Ma come può ordinare la listbox? – Sakthivel

+0

dopo aver eseguito ciò che ha detto Zinx, associa l'elenco a una DropDownList ... In questo modo, if (! IsPostback) { MyDropDownList.DataSource = ModifiedArrayList; MyDropDownList.Databind();} – eugeneK

3

Prova questo codice in caso di PreRender vostra ListBox.

System.Collections.SortedList sorted = new SortedList(); 

foreach (ListItem ll in ListBox1.Items) 
{ 
    sorted.Add(ll.Text, ll.Value); 
} 

ListBox1.Items.Clear(); 

foreach (String key in sorted.Keys) 
{ 
    ListBox1.Items.Add(new ListItem(key, sorted[key].ToString())); 
} 
+0

Sei una leggenda! Mi sono fermato sprecando 4 ore in più del necessario! – Fandango68

22

So che questa domanda è abbastanza vecchio, ma stavo guardando un modo di fare questo senza classi Comparer, ArrayLists ecc Quindi ho pensato di incollare il metodo che avevo usato per gli altri:

Si prega di notare che il mio metodo usa LINQ to Objects, quindi funzionerà solo nelle versioni più recenti del Framework.

// get a LINQ-enabled list of the list items 
List<ListItem> list = new List<ListItem>(ListBoxToSort.Items.Cast<ListItem>()); 
// use LINQ to Objects to order the items as required 
list = list.OrderBy(li => li.Text).ToList<ListItem>(); 
// remove the unordered items from the listbox, so we don't get duplicates 
ListBoxToSort.Items.Clear(); 
// now add back our sorted items 
ListBoxToSort.Items.AddRange(list.ToArray<ListItem>()); 
+0

Come funzionerebbe in VB.NET? E il tuo codice non distrugge tutti i valori, come in questo esempio: http://www.devcurry.com/2009/07/sort-items-in-aspnet-dropdownlist-using.html Grazie! – Flo

+0

No, nella prima riga, dove leggo gli oggetti ListItem, mantengo il riferimento a loro nella variabile "elenco". Quindi, quando l'elenco viene cancellato, questi stessi elementi vengono aggiunti di nuovo in seguito, solo in un ordine diverso. Il mio VB.NET è estremamente arrugginito, ma vedendo come sto usando la sintassi del metodo LINQ, penso che tu possa fare le stesse chiamate in un modo simile. Basta ricordare di includere (Importare) la libreria System.Linq. –

+0

Inutile a partire da VS2010 in poi – Fandango68

0

Ecco il codice vb Private Sub sortList (ByVal lb come DropDownList) 'ottenere un elenco LINQ-enabled delle voci di elenco Dim lista come nuovo List (Of ListItem) (lb.Items.Cast (Of ListItem)()) 'usa LINQ su Oggetti per ordinare gli articoli come richiesto list = list.OrderBy (Function (li) li.Text) .ToList() ' rimuovi gli elementi non ordinati dalla lista, quindi non ottenere duplicati lb.Items.Clear() 'ora aggiungere i nostri articoli ordinati lb.Items.AddRange (list.ToArray()) End Sub

0

So che questo è molto simile alla risposta di The King, ma questo è il modo in cui ha funzionato per me.

System.Collections.SortedList sorted = new System.Collections.SortedList(); 

foreach (ListItem ll in ListInQuestion.Items) 
{ 
    sorted.Add(ll.Value, ll.Text);//yes, first value, then text 
} 

ListInQuestion.Items.Clear(); 

foreach (String key in sorted.Keys) 
{ 
    ListInQuestion.Items.Add(new ListItem(sorted[key].ToString(), key));// <-- look here! 
} 

Spero che funzioni per qualcun altro.

Problemi correlati