Brendan
Brendan

Reputation: 19353

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

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.

Upvotes: 8

Views: 13350

Answers (3)

Mark Ronollo
Mark Ronollo

Reputation: 189

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

Upvotes: 0

Koryu
Koryu

Reputation: 1381

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

Upvotes: 3

Marc Gravell
Marc Gravell

Reputation: 1062630

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;

Upvotes: 11

Related Questions