Cómo cambiar el orden de las columnas de DataTable

Cómo cambiar el orden de las columnas de DataTable

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 lo que esperaba. Para evitar confusiones y facilitar su uso, decidí crear un método de extensión para ordenar 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"});

Esto se basa en la respuesta de "configuración regional predeterminada", pero eliminará los nombres de columna no válidos antes de establecer el ordinal. Esto se debe a que si accidentalmente envía un nombre de columna no válido, fallaría y si marca para evitar que falle, el índice sería incorrecto ya que omitiría los índices donde se haya pasado 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));
        }
}

Sé que esta es una pregunta muy antigua... y parece que fue respondida... Pero llegué aquí con la misma pregunta pero con un motivo diferente para la pregunta, por lo que me funcionó una respuesta ligeramente diferente. Tengo un buen genérico reutilizable vista de cuadrícula de datos que toma la fuente de datos que se le proporcionó y solo muestra las columnas en su orden predeterminado. Coloco alias y orden de columna y selección en el nivel de 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 devuelto a través del conjunto de datos. He encontrado que la única forma de hacer esto en el diseñador es eliminar todas las columnas seleccionadas dentro del adaptador de tabla y volver a agregarlas en el orden en que desea que se seleccionen.