Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 862
Brendan Avatar asked Jan 31 '09 18:01

Brendan


1 Answers

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;
like image 126
Marc Gravell Avatar answered Oct 17 '22 13:10

Marc Gravell