2009-11-05 11 views
7

Desarrollo una página web en la que se muestran los elementos del cuadro de lista que se extraen de una base de datos. Dinámicamente agregué algunos artículos en él. Se agrega al final del cuadro de lista, por lo que quiero ordenar el elemento del cuadro de lista después de agregar elementos. Intenté Arraylist para clasificar, pero no está funcionando.Ordene los elementos del cuadro de lista en C#

+5

Sería más eficiente ordenar la lista ** antes ** de agregar los elementos al cuadro de lista. –

+0

Pero cuando agrego los artículos que añado al fin. Pero lo necesito en el lugar apropiado. – Sakthivel

+1

¿Por qué no pega un código de muestra? – RichardOD

Respuesta

0

¿Quiere decir dinámicamente que agrega elementos a la lista a través de Javascript o después de la publicación detrás de somekind utilizando controles ASP.NET?

Si agrega dinámicamente usando Javascript, entonces su respuesta sería ordenar con jQuery y si después de la devolución de datos con ASP.NET debe utilizar el objeto de lista ubicado en System.Collections.Generic.

+0

Hola eugeneK, Dijo que usó Arraylist para ordenar ... Así que supongo que lo está haciendo en el servidor. Pero ahora dudo, ¿tenemos arraylist en javascript o en JQuery? –

1

Prueba el siguiente código:

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

Si ur vinculante el cuadro de lista mediante el establecimiento de origen de datos como DataTable poblada de datos DB entonces cuando se desea añadir un nuevo elemento en lugar de añadir el elemento de añadir el registro a la tabla de datos . A continuación, crear un DataView para esa tabla de datos, ordenar los datos en el DataView de la siguiente manera:

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

a continuación, establecer el origen de datos del cuadro de lista como dv.ToTable()

+0

no puedo entender lo que ha hecho aquí – Sakthivel

1

Hay que ordenar la tabla de datos antes de asignar como fuente de datos para el cuadro de lista .

DataTable.DefaultView.sort = "[Column Name]".

Como mencionó que está utilizando el método Agregar para agregar los Artículos de la Lista a la Lista, el método Agregar siempre agrega los Artículos de la Lista. Puede agregar elementos al índice deseado utilizando el método Insertar con índice. List.Insert (ListItem, índice)

Saludos

+0

¿Pero cómo puede ordenar el listbox? – Sakthivel

+0

después de haber hecho lo que dijo Zinx, Lista de enlaces a una lista desplegable ... Como tal, if (! IsPostback) { MyDropDownList.DataSource = ModifiedArrayList; MyDropDownList.Databind();} – eugeneK

3

Prueba este código en PreRender caso de su 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

¡Eres una leyenda! ¡Me detuve 4 horas más de lo que necesitaba! – Fandango68

0

Simplemente llame al ArrayList.Sort. Ejemplo de código en el enlace.

22

Sé que esta pregunta es bastante antiguo, pero yo estaba buscando en una manera de hacer esto sin clases Comparer, ArrayLists etc. Así que pensé en pegar el método que había utilizado para otros:

Atención: que mi método usa LINQ to Objects, por lo que solo funcionará en las versiones más recientes de 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

¿Cómo funcionaría esto en VB.NET? Y su código no destruye todos los valores, como en este ejemplo: http://www.devcurry.com/2009/07/sort-items-in-aspnet-dropdownlist-using.html ¡Gracias! – Flo

+0

No, en la primera línea, donde leo los objetos ListItem, mantengo la referencia a ellos en la variable "list". Entonces, cuando se borra la lista, esos mismos elementos se agregan luego, solo en un orden diferente. Mi VB.NET está extremadamente oxidado, pero al ver cómo estoy usando la sintaxis del método LINQ, creo que puede hacer las mismas llamadas de forma similar. Simplemente recuerde incluir (Importar) la biblioteca System.Linq. –

+0

Inútil a menos que VS2010 en adelante – Fandango68

0

Este es el código vb Private Sub sortList (ByVal lb Como DropDownList) 'obtener una lista habilitado para LINQ de los elementos de la lista lista Dim como nuevo la lista (de ListItem) (lb.Items.Cast (Of ListItem)()) 'use LINQ to Objects para ordenar los elementos según sea necesario list = list.OrderBy (Function (li) li.Text) .ToList() ' elimine los elementos desordenados del listbox, así que no obtenga duplicados lb.Items.Clear() 'ahora vuelva a agregar nuestros artículos ordenados lb.Items.AddRange (list.ToArray()) End Sub

0

Sé que esto es muy similar a la respuesta de The King, pero así es como funcionó para mí.

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

Espero que esto funcione para otra persona.

Cuestiones relacionadas