 <p>This doesn't sound right. To test it out, I wrote a simple app, that creates a DataTable and adds some data to it. On the button1 click it binds the table to the DataGridView. Then, I added a second button, which when clicked, adds another column to the underlying DataTable. When I tested it, and I clicked the second button, the grid immedialtey reflected the update. To test the reverse, I added a third button which pops up a dialog with a DataGridView that gets bound to the same datatable. At runtime, I then added some values to the first datagridview, and when I clicked the button to bring up the dialog, the changes were reflected.</p> <p>My point is, they are supposed to stay concurrent. Mark may be right when he suggested you check if AutoGenerateColumns is set to true. You don't need to call DataBind though, that's only for a GridView on the web. Maybe you can post of what you're doing, because this SHOULD work.</p> <p>How I tested it:</p> <pre><code> DataTable table = new DataTable(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { table.Columns.Add("Name"); table.Columns.Add("Age", typeof(int)); table.Rows.Add("Alex", 26); table.Rows.Add("Jim", 36); table.Rows.Add("Bob", 34); table.Rows.Add("Mike", 47); table.Rows.Add("Joe", 61); this.dataGridView1.DataSource = table; } private void button2_Click(object sender, EventArgs e) { table.Columns.Add("Height", typeof(int)); foreach (DataRow row in table.Rows) { row["Height"] = 100; } } private void button3_Click(object sender, EventArgs e) { GridViewer g = new GridViewer { DataSource = table }; g.ShowDialog(); } public partial class GridViewer : Form //just has a DataGridView on it { public GridViewer() { InitializeComponent(); } public object DataSource { get { return this.dataGridView1.DataSource; } set { this.dataGridView1.DataSource = value; } } } </code></pre>