绑定数据源后SetOrdinal方法失效,新增列无法按指定位置排列
嘿,我看你遇到了新增列后调用SetOrdinal(2),但列还是排在最后的问题,这大概率是绑定顺序和UI刷新的问题,我来给你捋清楚:
问题根源
你的代码是先把DataTable绑定到BindingSource和DataGridView之后,才去新增列并设置顺序。虽然DataTable内部的列顺序已经改了,但已经绑定的UI控件不会自动感知到这个结构变化,所以界面上还是会把新列放到最后。
两种解决办法
1. 调整代码顺序(推荐)
在绑定到UI之前就完成列的新增和排序,这样绑定的时候UI会直接用正确的列顺序:
conn = new MySqlConnection(connectString); conn.Open(); fireAdapter = new MySqlDataAdapter(query, conn); fireBuilder = new MySqlCommandBuilder(fireAdapter); fireDataTable = new DataTable(); fireAdapter.Fill(fireDataTable); // ✅ 先处理列的新增和排序,再绑定到UI DataColumn newcol = new DataColumn("Blah", typeof(string)); fireDataTable.Columns.Add(newcol); newcol.SetOrdinal(2); fireSource = new BindingSource(); fireSource.DataSource = fireDataTable; grid.DataSource = fireSource; conn.Close();
2. 绑定后手动刷新UI
如果必须在绑定之后新增列,那需要手动通知绑定源刷新,或者重置DataGridView的数据源:
// 你的原有代码:新增列并设置顺序后 newcol.SetOrdinal(2); // ✅ 触发绑定源刷新,通知UI更新 fireSource.ResetBindings(false); // 或者用重置数据源的方式(效果一样) // grid.DataSource = null; // grid.DataSource = fireSource;
额外检查
确认你的DataGridView的AutoGenerateColumns属性是true(默认就是true),如果设为false的话,你还需要手动给DataGridView添加对应列并设置DisplayIndex。
内容的提问来源于stack exchange,提问作者Cyrille Con Morales
相关产品推荐
相关产品推荐

