You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 11:35:23