Como alterar a ordem das colunas DataTable

87

Como alterar a ordem das colunas da tabela de dados em c #.

Exemplo:

O pedido do tipo de tabela sql criado é Qty, Unit, Id, mas no programa DataTable o pedido é Id, Qty, Unit. No código Atrás, passo diretamente DataTable para o tipo de tabela sql para que a ordem da tabela seja diferente.

DataTable columns are: `Id,Qty,Unit.`  I want this to be: `Qty,Unit,Id` 

Por favor ajude

Vyasdev Meledath
fonte
1
você pode explicar por que deseja alterar a ordem das colunas?
KBoek
A ordem do tipo de tabela sql foi criada, Qty,Unit,Id mas a ordem do programa DataTable é Id,Qty,Unit. No código Atrás, passo diretamente DataTable para o tipo de tabela sql para que a ordem da tabela seja diferente. É por isso que me perguntam "como alterar a ordem das colunas?"
Vyasdev Meledath
6
Basta responder o OP já.
Christian

Respostas:

227

Tente usar o método DataColumn.SetOrdinal . Por exemplo:

dataTable.Columns["Qty"].SetOrdinal(0);
dataTable.Columns["Unit"].SetOrdinal(1); 

ATUALIZAÇÃO: Esta resposta recebeu muito mais atenção do que eu esperava. Para evitar confusão e facilitar o uso, decidi criar um método de extensão para ordenação de colunas em DataTable:

Método de extensão:

public static class DataTableExtensions
{
    public static void SetColumnsOrder(this DataTable table, params String[] columnNames)
    {
        int columnIndex = 0;
        foreach(var columnName in columnNames)
        {
            table.Columns[columnName].SetOrdinal(columnIndex);
            columnIndex++;
        }
    }
}

Uso:

table.SetColumnsOrder("Qty", "Unit", "Id");

ou

table.SetColumnsOrder(new string[]{"Qty", "Unit", "Id"});
localidade padrão
fonte
dando como você disse, a estrutura da tabela mudou para Qty,Id,Unit only.I quero assim Qty,Unit,Id.
Vyasdev Meledath
Ofc, você deve usar esse método para todas as colunas, exceto a última.
localidade padrão
3
melhor corpo do método: var colIndex = 0; foreach (var colName em columnNames) table.Columns [colName] .SetOrdinal (colIndex ++);
JoelFan
@JoelFan Eu atualizei minha resposta, obrigado! Seu código definitivamente parece mais limpo.
localidade padrão
1
muito útil, tnx.
Jonathana
6

Isso é baseado na resposta do "local padrão", mas removerá os nomes de coluna inválidos antes de definir o ordinal. Isso ocorre porque, se você enviar acidentalmente um nome de coluna inválido, ele falhará e se você fizer uma verificação para evitar que ele falhe, o índice estará errado, pois ele ignorará os índices sempre que um nome de coluna inválido for passado.

public static class DataTableExtensions
{
    /// <summary>
    /// SetOrdinal of DataTable columns based on the index of the columnNames array. Removes invalid column names first.
    /// </summary>
    /// <param name="table"></param>
    /// <param name="columnNames"></param>
    /// <remarks> http://stackoverflow.com/questions/3757997/how-to-change-datatable-colums-order</remarks>
    public static void SetColumnsOrder(this DataTable dtbl, params String[] columnNames)
    {
        List<string> listColNames = columnNames.ToList();

        //Remove invalid column names.
        foreach (string colName in columnNames)
        {
            if (!dtbl.Columns.Contains(colName))
            {
                listColNames.Remove(colName);
            }
        }

        foreach (string colName in listColNames)
        {
            dtbl.Columns[colName].SetOrdinal(listColNames.IndexOf(colName));
        }
}
Soenhay
fonte
2

Eu sei que esta é uma pergunta muito antiga .. e parece que foi respondida .. Mas eu cheguei aqui com a mesma pergunta, mas um motivo diferente para a pergunta, e então uma resposta ligeiramente diferente funcionou para mim. Eu tenho um bom datagridview genérico reutilizável que pega a fonte de dados fornecida a ele e apenas exibe as colunas em sua ordem padrão. Coloquei aliases e ordem e seleção de colunas no nível tableadapter do conjunto de dados no designer. No entanto, a alteração da ordem de consulta selecionada das colunas não parece afetar as colunas retornadas pelo conjunto de dados. Descobri que a única maneira de fazer isso no designer é remover todas as colunas selecionadas no tableadapter, adicionando-as de volta na ordem em que você deseja que sejam selecionadas.

da Bich
fonte
1

Se você tiver mais de 2-3 colunas, nãoSetOrdinal é o caminho a percorrer. O método de DataView aceita um array de parâmetros de nomes de colunas. Ordene suas colunas lá:ToTable

DataView dataView = dataTable.DefaultView;
dataTable = dataView.ToTable(true, "Qty", "Unit", "Id");
Brent McKain
fonte
0

Podemos usar este método para alterar o índice da coluna, mas deve ser aplicado a todas as colunas se houver mais de dois números de colunas, caso contrário, ele mostrará todos os valores impróprios da tabela de dados ............ ........

santosh
fonte
-3

Reordenando a tabela de dados com base em alguma condição ou caixa de seleção marcada. PFB: -

 var tableResult= $('#exampleTable').DataTable();

    var $tr = $(this).closest('tr');
    if ($("#chkBoxId").prop("checked")) 
                    {
                        // re-draw table shorting based on condition
                        tableResult.row($tr).invalidate().order([colindx, 'asc']).draw();
                    }
                    else {
                        tableResult.row($tr).invalidate().order([colindx, "asc"]).draw();
                    }
satya prakash
fonte
Por favor, leia a pergunta com atenção. A consulta acima é para c #, não para jquery
Ahmad Mukhtar
1
Esta resposta não é apenas para o idioma errado, a questão era para ordenar colunas, não para ordenar linhas. Como você chegou a essa resposta, quanto mais 8 anos após sua resposta aceita? Por quê?
jreed121