Pergunta

Estou curioso para saber a melhor rota (mais olhando para a simplicidade, não velocidade ou eficiência) para classificar um DropDownList em C # / ASP.NET - Eu olhei para algumas recomendações, mas eles não estão clicando bem com me.

Edit:. Gente, eu não tenho controle sobre como os dados vêm para o DropDownList - Eu não posso modificar o SQL

Foi útil?

Solução

Se você receber uma DataTable com os dados, você pode criar um DataView fora deste e depois ligam na lista para esse baixo. Seu código seria algo parecido ...

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

ddlOptions.DataSource = dvOptions;
ddlOptions.DataTextField = "Description";
ddlOptions.DataValueField = "Id";
ddlOptions.DataBind();
opções

O campo de texto e campo de valor são mapeados para os columnns apropriadas na tabela de dados que está a receber.

Outras dicas

A C # solução para .NET 3,5 (System.Linq precisa e 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);
    }

Chamá-lo depois de ter ligado o seu dropdownlist, por exemplo, OnPreRender:

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

Cole-o em sua biblioteca de utilitários para facilitar a reutilização.

Assumindo que você está rodando a última versão do .Net Framework este trabalho:

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

DropDownList toma qualquer IEnumerable como uma fonte de dados.

Apenas classificá-lo usando LINQ.

Eu costumo carregar uma DropDownList com os valores de uma tabela de banco de dados, de modo a maneira mais fácil é para classificar os resultados como desejado com a cláusula ORDER BY da instrução SELECT, e depois é só percorrer os resultados e despejá-los para o DropDownList.

Dê uma olhada na este artigo de CodeProject , que reorganiza a conteúdo de um dropdownlist. Se você está ligação de dados, você vai precisar para executar o classificador após os dados é obrigado a lista.

É recomendado para classificar os dados antes de ligação de dados para o DropDownList, mas no caso de você não pode, é assim que você pode classificar os itens no DropDownList.

Primeiro você precisa de uma classe de comparação

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

Em seguida, você precisa de um método que irá utilizar este Comparer para ordenar a 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, chamar esta função com o DropDownList (depois de ter sido databound)

SortDropDown(cboMyDropDown)

P.S. Desculpe, mas a minha escolha da linguagem é VB. Você pode usar http://converter.telerik.com/ para converter o código do VB para C #

Outra opção é colocar os ListItems em uma matriz e tipo.

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

Eu concordo com a classificação usando ORDER BY ao preencher com uma consulta de banco de dados, se tudo que você quer é para classificar os resultados exibidos em ordem alfabética. Deixe o motor de banco de dados de fazer o trabalho de classificação.

No entanto, às vezes você quer alguma outra ordem de classificação além alfabética . Por exemplo, você pode querer uma sequência lógica como: Novo, Abrir, em andamento, Concluído, Aprovado, Closed. Nesse caso, você pode adicionar uma coluna para a tabela de banco de dados para definir explicitamente a ordem de classificação. Nomeá-lo algo como SortOrder ou DisplaySortOrder. Então, em seu SQL, você ORDER BY o campo ordem de classificação (sem recuperar esse campo).

Que tipo de objeto que você está usando para ligação de dados? Normalmente eu uso Collection , List , ou Queue (dependendo das circunstâncias). Estes são relativamente fáceis de ordenação usando um delegado personalizado. Consulte documentação MSDN na Comparação (T) delegar .

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

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

Experimente

------- loja Procedimento ----- (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 classe auxiliar ----

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

Eu concordo com o pessoal na classificação de seus dados no modelo antes de preencher-los para o DropDownList, por isso, se você está preenchendo isso de um DB, é uma boa coisa para obtê-los ordenados já lá usando um simples ordem por cláusula, você vai economizar alguns ciclos no servidor web, e estou certo que o DB irá fazê-lo muito mais rápido. Se você está preenchendo este de outra fonte de dados, por exemplo, um arquivo XML, usando LINQ vai ser uma boa idéia, ou mesmo qualquer variação de Array.Sort vai ser bom.

Se os seus dados está chegando a você como um System.Data.DataTable, chame o método .Select do DataTable (), passando em "" para o filterExpression e "ASC COLUMN1" (ou qualquer coluna que você deseja classificar) para o tipo. Isso irá retornar uma matriz de DataRow objetos, classificado como especificado, que você pode, então, iterate através de e despejo no 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();

Para classificar uma fonte de dados objeto que retorna um conjunto de dados que você usar o Sort propriedade do controle.

Exemplo de uso Na página aspx para ordenar por ordem de ColumnName ascendente

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

é melhor se você classificar a Fonte antes de Ligação para DropDwonList. mas DropDownList.Items classificar 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())

(neste caso eu meio por uma corda (o texto do item), que poderia ser o nome do suplier, ID do fornecedor)

o método Sort() é para cada List(of ) / List<MyType>, você pode usá-lo.

Você pode fazê-lo desta maneira é simples

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

}

E chamar o método deste SortDDL (ref yourDropDownList); e é isso. Os dados da sua dropdownlist serão classificados.

http: // www .codeproject.com / artigos / 20131 / Sorting-Dropdown-list-em-ASP-NET-usando-C #

Você pode usar esta função 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;
         }
      }
   }
}

Tente isto:

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

}

Isso vai demorar um dado queda lista com um texto e uma propriedade de valor do item da lista para baixo e colocá-los de volta para a queda de determinada lista para baixo. Melhor da sorte!

Se você está adicionando opções para o suspenso por um sem um conjunto de dados e você quer classificá-lo mais tarde, após a adição de itens, aqui está uma solução:

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

Este seria classificar os itens suspensos em ordem alfabética.

Se você estiver usando um conjunto de dados delimitadas DropDownList, basta ir para o assistente e editar a consulta delimitadora por:

  1. Ir à página .aspx (modo de design).
  2. Clique na magia Arrow ">" na lista suspensa.
  3. Selecione "fonte de configurar os dados".
  4. Clique em Próximo.
  5. No lado direito da janela, clique aberto "ORDER BY ...".
  6. Você terá até dois cariteria campo lá para classificar. Selecione o campo desejado e clique em OK, clique em Concluir.

enter descrição da imagem aqui

Você pode não ter acesso ao SQL, mas se você tiver o DataSet ou DataTable, certamente você pode chamar o método Sort().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top