当TextBox值被更改时立即更新DataGridView数据源

问题描述:

我有一个绑定到业务对象列表(每个对象只有一个可编辑字段)的简单DataGridView。我需要用户对该值进行的任何更改(在DataGridViewTextBoxColumn中)以更新绑定对象。也就是说,以与绑定普通文本框并使用“OnPropertyChanged”选项时可用的相同方式为每个按键进行更新。当TextBox值被更改时立即更新DataGridView数据源

原因是我只需要在绑定对象的“IsDirty”属性为true时启用表单上的“确定”按钮。

对于复选框列和使用CurrentCellDirtyStateChanged事件并调用CommitEdit,似乎有很多关于各种网站的讨论。我已经尝试过这种方法,但是这样做有第一个按键清除所有文本单元格的不幸副作用!

任何帮助非常感谢,谢谢。

+0

您确实需要更新数据源吗?难道你不是简单地使用CurrentCellDirtyStateChanged事件并启用按钮?当按钮被点击时,焦点丢失时数据源应该更新。 –

这听起来像你想要的是,只要用户开始在任何单元格中键入,启用按钮?点击按钮之前,DataSource实际上是否需要更新?

如果不是那么CurrentCellDirtyStateChanged应该正常工作 - 只是不要调用CommitEdit方法,而是将您的按钮设置为在那里启用。

当单元格失去焦点时,更改将应用​​于DataSource - 因此,单击按钮时,您将能够处理正确的数据。


我想我可能已经找到了解决办法 - 不是100%肯定,因为我没有你要连接的IsDirty变化,看到这一切工作的MVC控制器 - 我把一个破发点中一个属性设置器在我的DataSource对象上,它会被下面的代码触发,而不是没有它,所以我认为这是有效的。

它只是为DataErrorContext参数使用CurrentCellDirtyStateChanged和CurrentCellChange枚举。

void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e) 
{ 
    dataGridView1.CommitEdit(DataGridViewDataErrorContexts.CurrentCellChange); 
} 
+0

这是我想要的效果是的,但我有一个模型 - 视图 - 控制器(MVC)体系结构,因此必须在对象中完成工作。该按钮在对象脏的情况下启用,而不是直接由表单上的代码启用。 – Darren

+0

我发现,当试图获得一个MV *架构(我使用MVP的winforms)数据绑定阻碍。 –

+0

@Darren - 也是对架构的一种思考,除非你要求一个非常严格的被动视图,你不能从CurrentCellDirtyStateChanged事件发送一条消息到你的控制器,然后将必要的改变为视图 - 数据绑定不会'不一定需要进入它。 –