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.

default locale
  • 13,035
  • 13
  • 56
  • 62
Brendan
  • 18,771
  • 17
  • 83
  • 114

4 Answers4

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;
Marc Gravell
  • 1,026,079
  • 266
  • 2,566
  • 2,900
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
Koryu
  • 1,371
  • 1
  • 11
  • 21
  • 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; – Mark Ronollo Aug 16 '23 at 18:19
0

Don't forget to turn on and off AutoColumnCreate to ensure that you'r DisplatIndex's work.

http://www.internetworkconsulting.net/content/datadridview-displayorder-not-working

Shawn
  • 111
  • 1
  • 2
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
Mark Ronollo
  • 174
  • 1
  • 7