Reputation: 19353
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
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
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
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