C#中无法通过代码修改DataGridView单元格的显示值
问题解决:DataGridView单元格值已设置但界面不显示
你遇到的问题核心是DataGridView绑定数据源后,直接修改单元格值会被数据源的绑定机制覆盖——控件的显示完全依赖绑定的数据源对象,临时修改单元格的内存值无法持久化到界面,只会被数据源同步逻辑冲掉,而控制台打印的是你刚设置的临时值,所以能看到结果。
原因分析
你通过TheLoaiGrid.DataSource = TheLoaiList;把DataGridView和集合绑定后,单元格的显示值是从集合内每个对象的对应属性读取的。直接修改单元格Value,只是改动了控件内存里的临时数据,但控件会定期和数据源同步,导致界面看不到变化。
解决方案
方案1:直接修改数据源对象属性(推荐)
跳过修改单元格,直接修改TheLoaiList中每个对象的SoTuaSach属性,这样DataGridView会自动同步显示:
TheLoaiList = BUSTheLoai.Instance.GetAllTheLoai(); // 先修改数据源里的对象属性 foreach (var item in TheLoaiList) { item.SoTuaSach = "10"; Console.WriteLine(item.SoTuaSach); } // 绑定数据源(如果已经绑定过,修改后重置数据源触发刷新) TheLoaiGrid.DataSource = null; TheLoaiGrid.DataSource = TheLoaiList;
如果你的TheLoai类实现了INotifyPropertyChanged接口,修改属性后界面会自动刷新,不需要重置数据源。
方案2:用BindingList实现自动更新
如果需要后续频繁修改数据并自动刷新界面,把普通List换成BindingList,它自带属性变更通知机制:
var bindingList = new BindingList<TheLoai>(BUSTheLoai.Instance.GetAllTheLoai()); TheLoaiGrid.DataSource = bindingList; // 修改BindingList里的对象,界面会自动同步 foreach (var item in bindingList) { item.SoTuaSach = "10"; Console.WriteLine(item.SoTuaSach); }
方案3:手动强制刷新单元格(仅临时场景用)
如果一定要直接修改单元格,修改后强制刷新单元格或控件:
TheLoaiList = BUSTheLoai.Instance.GetAllTheLoai(); TheLoaiGrid.DataSource = TheLoaiList; int i = 0; foreach (DataGridViewRow row in TheLoaiGrid.Rows) { if (!row.IsNewRow) // 跳过最后一行空行 { row.Cells["SoTuaSach"].Value = "10"; Console.WriteLine(row.Cells["SoTuaSach"].Value); // 刷新当前单元格 row.Cells["SoTuaSach"].Refresh(); i++; } } // 也可以刷新整个控件 // TheLoaiGrid.Refresh();
注意:这种方式不推荐,一旦数据源重新同步(比如控件重绘),单元格值会被数据源覆盖。
内容的提问来源于stack exchange,提问作者Thương Lệ Hoài
相关产品推荐
相关产品推荐

