views:

2378

answers:

1

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;
            int i;
            for (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.

+2  A: 

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
This works, but seems a little heavy handed
Brendan
It is what it is...
Marc Gravell