C#中DataTable绑定DataGridView后无数据显示问题求助
解决DataTable有数据但DataGridView不显示的问题
我之前也碰到过一模一样的问题——明明DataTable里实打实有数据,绑到DataGridView后却啥都不显示。结合你贴的代码,我梳理几个最可能的原因和对应的解决办法:
首先先把你的代码整理出来方便分析:
DataTable optionDt = new DataTable("Options"); DataColumn optionName = new DataColumn("Name", typeof(string)); DataColumn optionVal = new DataColumn("Value", typeof(string)); optionDt.Columns.Add(optionName); optionDt.Columns.Add(optionVal); if (frmMode == FormUtilities.MODEADD) { if (PRODUCT_VARIATION.ProdOptions.Count() > 0) { flOptionPanel.Controls.Clear(); optionSkus.Clear(); foreach (ProductOption po in PRODUCT_VARIATION.ProdOptions) { if (optionSkus.Count() < 3) { optionSkus.Add(po.Value); } if (optionDt != null) { optionDt.Rows.Add(po.Name, po.Value); } } staticDataGVSpecification.DataSource = optionDt; } }
1. 静态方法操作UI控件的线程问题
你是在静态方法里给staticDataGVSpecification设置数据源,但WinForms的UI控件只能在创建它的主线程上操作。如果这个静态方法是从非UI线程调用的,就算数据没问题,UI也不会更新显示——这是WinForms里非常常见的坑。
解决办法:切换回UI线程再更新控件,用Invoke或者BeginInvoke:
// 替换原来的 staticDataGVSpecification.DataSource = optionDt; 这一行 if (staticDataGVSpecification.InvokeRequired) { staticDataGVSpecification.Invoke(new Action(() => { staticDataGVSpecification.DataSource = optionDt; })); } else { staticDataGVSpecification.DataSource = optionDt; }
2. DataGridView的自动列生成被关闭
检查一下staticDataGVSpecification的AutoGenerateColumns属性是不是被设成了false。如果是手动添加了列但没和DataTable的列对应上,或者自动生成列被关闭了,就会显示空白。
解决办法:
- 如果想让控件自动根据DataTable生成列,确保这个属性为
true:staticDataGVSpecification.AutoGenerateColumns = true; staticDataGVSpecification.DataSource = optionDt; - 如果是手动添加了列(比如在设计器里加的),需要把列的
DataPropertyName和DataTable的列名对应起来:// 假设你设计器里加的列叫colName和colValue staticDataGVSpecification.Columns["colName"].DataPropertyName = "Name"; staticDataGVSpecification.Columns["colValue"].DataPropertyName = "Value"; staticDataGVSpecification.DataSource = optionDt;
3. 数据源绑定后未刷新控件
有时候就算数据源设置正确,控件也可能没及时刷新。可以试试设置完数据源后强制刷新,或者重置绑定:
staticDataGVSpecification.DataSource = null; // 先清空旧数据源 staticDataGVSpecification.DataSource = optionDt; staticDataGVSpecification.Refresh(); // 强制刷新控件
4. 条件分支的执行问题
再仔细检查一下你的代码逻辑:
- 是不是
frmMode不等于FormUtilities.MODEADD? - 是不是
PRODUCT_VARIATION.ProdOptions.Count()等于0,导致设置数据源的代码根本没执行? - 可以在设置数据源的地方加个断点,确认这段代码确实被执行了,而且
optionDt.Rows.Count大于0。
内容的提问来源于stack exchange,提问作者Deeyo Pradhan
相关产品推荐
相关产品推荐

