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

DataGridView绑定DataTable后修改UI值为何未触发属性Set方法?

为什么DataGridView修改值时DataTable属性的set方法没触发?

这是个很容易踩的认知坑,我来给你理清楚其中的逻辑:

先搞懂属性set方法的触发时机

你的Dt属性的set方法只有在你直接给这个属性重新赋值的时候才会被调用——比如执行Dt = new DataTable();或者Dt = 另一个DataTable实例;这种代码时,才会触发set方法。而你在DataGridView里修改单元格值的操作,完全没有涉及到给Dt属性重新赋值,自然不会触发它的set方法。

DataGridView绑定DataTable的本质

当你执行dataGridView1.DataSource = Dt;时,DataGridView是直接和_dt这个DataTable实例建立了绑定关系。之后你在UI上修改单元格值,实际上是直接修改了这个实例内部的行数据(相当于直接执行Dt.Rows[某行][某列] = 新值这种操作)——你只是改变了这个实例里的数据,并没有替换掉Dt属性引用的那个实例,所以Dt的set方法根本不会被触发。

如何监听DataTable的数据变化

如果想要捕获DataGridView里的修改操作,你可以通过以下两种方式:

  1. 监听DataTable的事件:比如RowChanged或ColumnChanged,它们会在DataTable内部数据变化时触发:
public Form1()
{
    InitializeComponent();
    Dt = new DataTable();
    Dt.Columns.Add("Age");
    Dt.Columns.Add("Name");
    Dt.Rows.Add(19, "kim");
    Dt.Rows.Add(25, "Lee");
    // 订阅RowChanged事件
    Dt.RowChanged += Dt_RowChanged;
    dataGridView1.DataSource = Dt;
}

private void Dt_RowChanged(object sender, DataRowChangeEventArgs e)
{
    // 这里可以处理数据变化的逻辑
    Console.WriteLine($"第{e.Row.Index}行的数据已更新");
}
  1. 监听DataGridView的事件:比如CellValueChanged,它会在UI单元格值修改完成时触发:
public Form1()
{
    InitializeComponent();
    // ... 其他初始化代码
    dataGridView1.CellValueChanged += DataGridView1_CellValueChanged;
}

private void DataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    var changedValue = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
    Console.WriteLine($"单元格({e.RowIndex}, {e.ColumnIndex})的值变为:{changedValue}");
}

总结一下

你之前的预期偏差,核心是混淆了「修改属性引用对象的内部数据」和「给属性重新赋值」这两个完全不同的操作。前者不会触发属性的set方法,只有后者才会。如果要监听数据变化,得用DataTable或DataGridView的对应事件,而不是依赖属性的set。

内容的提问来源于stack exchange,提问作者ysOh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:17:39