Changing column order in DataTable bound to DataGridView does not reflect in the view
Asked Answered
H

3

8

When the application is run, the DataGridView is bound to a DataTable. Later I add more columns to the DataTable programmatically and it is reflected in the underlying data - i.e. the column Ordinals are as they should be. However this is not reflected in the DataGridView. Instead columns are appended onto the originally generated set.

This example demonstrates,

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    public DataTable data = new DataTable();

    private void button1_Click(object sender, EventArgs e)
    {

        this.dataGridView1.DataSource = data;
        for (int i = 0; i < 5; i++)
        {
            this.data.Columns.Add(i.ToString());
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        DataColumn foo = new DataColumn();
        this.data.Columns.Add(foo);
        foo.SetOrdinal(0);
    }

    private void button3_Click(object sender, EventArgs e)
    {
        foreach (DataColumn tmpCol in this.data.Columns)
        {
            Console.WriteLine("{0} : {1}", tmpCol.ColumnName, tmpCol.Ordinal);
        }
    }
}

Button 1 generates the columns, button 2 adds a column and sets the ordinal to 0 so it should be first in the grid, button 3 displays the ordinals of the columns and shows they are how they should be in the DataTable.

Handle answered 31/1, 2009 at 18:47 Comment(0)
H
11

That is just how DataGridView works; with auto-generate columns enabled, extra (unmapped) columns are appended to the end. You can unbind and re-bind to fix it; set the DataSource to null and back to the table:

this.dataGridView1.DataSource = null;
this.dataGridView1.Columns.Clear();
this.dataGridView1.DataSource = data;
Hereinbefore answered 31/1, 2009 at 18:49 Comment(0)
S
3

I had a similar problem and solved it with the DataGridViewColumn.DisplayIndex property.

dgvData.Columns["COLUMN_NAME"].DisplayIndex = 0;  // will move your custom column to first position
Sousa answered 3/7, 2013 at 10:33 Comment(1)
The solution above gives more refined control after dynamically binding the dgv to a binding data source: BindingSource bindingSource = new BindingSource(); dgvConciseView.AutoGenerateColumns = true; bindingSource.DataSource = new myDataClass() { T = 5, TR = 5, K = 0, t = 3, N = 3600 }; dgvConciseView.DataSource = bindingSource; dgvConciseView.Columns["T"].DisplayIndex = 0;Intima
I
0

See Koryu's answer below! The solution below gives more refined control after dynamically binding the dgv to a binding data source:

BindingSource bindingSource = new BindingSource();
dgvData.AutoGenerateColumns = true;
bindingSource.DataSource = new myDataClass() { T = 5, TR = 5, K = 0, t = 3, N = 3600 };
dgvData.DataSource = bindingSource;
dgvData.Columns["T"].DisplayIndex = 0;    //******* Koryu's answer below
Intima answered 16/8, 2023 at 18:22 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.