mvc - dropdownlist c# example
¿Ordenar una DropDownList?-C#, ASP.NET (23)
Acepto que la gente clasifique los datos en el modelo antes de rellenarlos en DropDownList, por lo que si está completando esto desde un DB, es una buena idea ordenarlos ya allí utilizando una cláusula order by simple, se guardará algunos ciclos en el servidor web, y estoy seguro de que el DB lo hará mucho más rápido. Si está rellenando esto de otra fuente de datos, por ejemplo, un archivo XML, usar LINQ será una buena idea, o incluso cualquier variación de Array.Sort será bueno.
Tengo curiosidad sobre la mejor ruta (más mirando hacia la simplicidad, no la velocidad o la eficiencia) para ordenar DropDownList en C # / ASP.NET. He observado algunas recomendaciones, pero no me están respondiendo bien.
Editar: Amigos, no tengo control sobre cómo entran los datos en DropDownList. No puedo modificar el SQL.
DropDownList toma cualquier IEnumerable como un DataSource.
Solo agréguelo usando LINQ.
Eche un vistazo al artículo de CodeProject , que reorganiza el contenido de una lista desplegable. Si es un enlace de datos, deberá ejecutar el clasificador después de que los datos estén vinculados a la lista.
Normalmente cargo una DropDownList con valores de una tabla de base de datos, por lo que la forma más fácil es ordenar los resultados según lo deseado con la cláusula ORDER BY de su instrucción SELECT, y luego iterar a través de los resultados y volcarlos en DropDownList.
Si sus datos le llegan como System.Data.DataTable, llame al método .Select () de DataTable, pasando "" para filterExpression y "COLUMN1 ASC" (o la columna que desee ordenar) para el ordenamiento. Esto devolverá una matriz de objetos DataRow, ordenados según lo especificado, que luego puede iterar y volcar en DropDownList.
¿Qué tipo de objeto estás utilizando para el enlace de datos? Normalmente utilizo Collection <T>, List <T> o Queue <T> (según las circunstancias). Estos son relativamente fáciles de ordenar usando un delegado personalizado. Consulte la documentación de MSDN en el delegado de Comparación (T) .
Estoy de acuerdo con ordenar usando ORDER BY al completar con una consulta de base de datos, si todo lo que desea es ordenar los resultados mostrados alfabéticamente. Deje que el motor de base de datos haga el trabajo de ordenar.
Sin embargo, a veces quieres algún otro orden además de alfabético . Por ejemplo, es posible que desee una secuencia lógica como: Nuevo, Abierto, En progreso, Completado, Aprobado, Cerrado. En ese caso, podría agregar una columna a la tabla de la base de datos para establecer explícitamente el orden de clasificación. Nómbralo como SortOrder o DisplaySortOrder. Luego, en su SQL, ORDENE POR el campo de orden de clasificación (sin recuperar ese campo).
Puede que no tenga acceso al SQL, pero si tiene DataSet o DataTable, puede llamar al método Sort()
.
Suponiendo que está ejecutando la última versión de .Net Framework, esto funcionará:
List<string> items = GetItemsFromSomewhere();
items.Sort((x, y) => string.Compare(x, y));
DropDownListId.DataSource = items;
DropDownListId.DataBind();
Si obtiene una DataTable con los datos, puede crear un DataView fuera de esto y luego vincular la lista desplegable a eso. Tu código se vería como ...
DataView dvOptions = new DataView(DataTableWithOptions);
dvOptions.Sort = "Description";
ddlOptions.DataSource = dvOptions;
ddlOptions.DataTextField = "Description";
ddlOptions.DataValueField = "Id";
ddlOptions.DataBind();
El campo de texto y las opciones del campo de valor se asignan a las columnas adecuadas en la tabla de datos que está recibiendo.
Se recomienda ordenar los datos antes de enlazarlos a DropDownList, pero en caso de que no pueda, así es como ordenaría los elementos en DropDownList.
Primero necesitas una clase de comparación
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
Entonces necesitas un método que use este Comparer para ordenar 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
Finalmente, llame a esta función con su DropDownList (después de que haya sido enlazado a datos)
SortDropDown(cboMyDropDown)
PD: Lo siento, pero mi elección de idioma es VB. Puede usar http://converter.telerik.com/ para convertir el código de VB a C #
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();
Solución AC # para .NET 3.5 (necesita System.Linq y 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);
}
Llámalo después de haber vinculado tu lista desplegable, por ejemplo, OnPreRender:
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
ddlMyDropDown.ReorderAlphabetized();
}
Colóquelo en su biblioteca de utilidad para volver a usarlo fácilmente.
Para ordenar un origen de datos de objeto que devuelve un conjunto de datos, utiliza la propiedad Ordenar del control.
Ejemplo de uso En la página aspx para ordenar por orden ascendente de ColumnName
<asp:ObjectDataSource ID="dsData" runat="server" TableName="Data"
Sort="ColumnName ASC" />
Otra opción es poner los ListItems en una matriz y ordenarlos.
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();
var list = ddl.Items.Cast<ListItem>().OrderBy(x => x.Text).ToList();
ddl.DataSource = list;
ddl.DataTextField = "Text";
ddl.DataValueField = "Value";
ddl.DataBind();
es mejor si ordena la fuente antes de vincularla a DropDwonList. pero ordena DropDownList.Items como este:
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())
(este caso lo clasifico por una cadena (el texto del artículo), podría ser el nombre del proveedor, la identificación del proveedor)
el método Sort()
es para cada List(of )
/ List<MyType>
, puede usarlo.
Puedes hacerlo de esta manera es 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);
}
}
Y llame al método este SortDDL (ref yourDropDownList); y eso es. Los datos en su lista desplegable serán ordenados.
ver http://www.codeproject.com/Articles/20131/Sorting-Dropdown-list-in-ASP-NET-using-C#
Puedes usar esta función de 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;
}
}
}
}
Intentalo
------- Almacenar el procedimiento ----- (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;
}
}
Prueba esto:
/// <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);
}
}
}
Esto tomará una lista desplegable dada con una propiedad de Texto y un Valor del elemento de la lista y los colocará nuevamente en la lista desplegable dada. ¡La mejor de las suertes!
Si agrega opciones al menú desplegable una por una sin un conjunto de datos y desea ordenarlas más adelante después de agregar elementos, aquí hay una solución:
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();
Esto ordenaría los elementos desplegables en orden alfabético.
Si está utilizando DropDownList con un límite de datos, solo vaya al asistente y edite la consulta de delimitación de la siguiente manera:
- Vaya a la página .aspx (vista de diseño).
- Haga clic en la flecha mágica ">" en la lista desplegable.
- Seleccione "Configurar origen de datos".
- Haga clic en Siguiente.
- En el lado derecho de la ventana abierta, haga clic en "PEDIR POR ...".
- Tendrás arriba dos cariteria de campo para ordenar. Seleccione el campo deseado y haga clic en Aceptar, luego haga clic en Finalizar.