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里的修改操作,你可以通过以下两种方式:
- 监听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}行的数据已更新"); }
- 监听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
相关产品推荐
相关产品推荐

