Cómo cambiar el orden de las columnas de DataTable

91

Cómo cambiar el orden de las columnas de la tabla de datos en c #.

Ejemplo:

El pedido del tipo de tabla sql creado es Cant, Unidad, Id, pero en el programa el orden de DataTable es Id, Cant, Unidad. En el código Detrás, paso directamente DataTable al tipo de tabla SQL para que el orden de la tabla sea diferente.

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

Por favor ayuda

Vyasdev Meledath
fuente
1
¿Puede explicar por qué le gustaría cambiar el orden de las columnas?
KBoek
El orden de tipo de tabla SQL creado es Qty,Unit,Id pero en el programa el orden de DataTable es Id,Qty,Unit. En el código Detrás, paso directamente DataTable al tipo de tabla sql para que el orden de la tabla sea diferente. Por eso me preguntan "¿cómo cambiar el orden de las columnas?"
Vyasdev Meledath
6
Simplemente responda el OP ya.
Christian

Respuestas:

232

Intente utilizar el método DataColumn.SetOrdinal . Por ejemplo:

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

ACTUALIZACIÓN: Esta respuesta recibió mucha más atención de la que esperaba. Para evitar confusiones y facilitar su uso, decidí crear un método de extensión para ordenar las columnas en DataTable:

Método de extensión:

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

o

table.SetColumnsOrder(new string[]{"Qty", "Unit", "Id"});
configuración regional predeterminada
fuente
al dar como dijiste, la estructura de la tabla cambió a Qty,Id,Unit solo. Quiero así Qty,Unit,Id.
Vyasdev Meledath
Ofc, debes usar este método para todas las columnas excepto la última.
configuración regional predeterminada
4
mejor cuerpo del método: var colIndex = 0; foreach (var ColName en columnNames) table.Columns [colName] .SetOrdinal (colIndex ++);
JoelFan
@JoelFan He actualizado mi respuesta, ¡gracias! Tu código definitivamente se ve más limpio.
configuración regional predeterminada
1
muy útil, tnx.
Jonathana
6

Esto se basa en la respuesta de la "configuración regional predeterminada" pero eliminará los nombres de columna no válidos antes de establecer el ordinal. Esto se debe a que si envía accidentalmente un nombre de columna no válido, fallará y si marca una casilla para evitar que falle, el índice sería incorrecto, ya que omitiría índices dondequiera que se pasara un nombre de columna no válido.

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
fuente
2

Sé que esta es una pregunta muy antigua ... y parece que fue respondida ... Pero llegué aquí con la misma pregunta pero una razón diferente para la pregunta, por lo que una respuesta ligeramente diferente funcionó para mí. Tengo una bonita vista de cuadrícula de datos genérica reutilizable que toma la fuente de datos proporcionada y solo muestra las columnas en su orden predeterminado. Puse los alias y el orden y la selección de las columnas en el nivel del adaptador de tabla del conjunto de datos en el diseñador. Sin embargo, cambiar el orden de consulta de selección de las columnas no parece afectar las columnas devueltas a través del conjunto de datos. Encontré que la única forma de hacer esto en el diseñador es eliminar todas las columnas seleccionadas en el adaptador de tabla y volver a agregarlas en el orden en que las desea seleccionar.

da Bich
fuente
1

Si tiene más de 2-3 columnas, noSetOrdinal es el camino a seguir. El método de DataView acepta una matriz de parámetros de nombres de columna. Ordene sus columnas allí:ToTable

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

Podemos usar este método para cambiar el índice de la columna, pero debe aplicarse a todas las columnas si hay más de dos columnas, de lo contrario, mostrará todos los valores incorrectos de la tabla de datos ............ ........

santosh
fuente
-3

Reordenar la tabla de datos en función de alguna condición o casilla de verificación 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
fuente
Lea atentamente la pregunta. La consulta anterior es para c # no para jquery
Ahmad Mukhtar
1
Esta respuesta no solo es para el idioma incorrecto, sino que la pregunta era ordenar las columnas y no las filas. ¿Cómo llegó a esta respuesta, y mucho menos más de 8 años después de su respuesta aceptada? ¿Por qué?
jreed121