2

我正在编写一个选项卡式 WinForms 应用程序,其中包含多个绑定到 BindingSources 的 DataGridView 控件。BindingSources 又被绑定到业务对象的 BindingLists。我的业务对象实现了 INotifyPropertyChanged。

我的 TabControl 有三个 TabPage(A、B 和 C)。如果我的用户对选项卡 A 上的 DataGridView 控件中的数据进行了更改,然后尝试切换到选项卡 B 或 C 而不提交更改(在这种情况下,将数据写入磁盘),我需要提示他们保存改变或失去它们。

为了确定是否对给定选项卡进行了更改,我为每个选项卡创建了“pendingChange”变量。每个 DataGridView 控件都有自己的 CellValidating 事件处理程序,在用户进行更改时我会在其中验证数据。在该事件处理程序结束时,如果更改已通过所有验证检查,我将该选项卡的 pendingChange 变量设置为 true。当我的用户单击按钮将更改写回磁盘时,我重置了 pendingChange 变量。因此,每当我的用户尝试更改为不同的选项卡时,我都会检查此变量以确定是否需要先保存任何更改。

现在我意识到这种设计的一个大缺陷是每次单元格失去焦点时都会触发 DataGridView 控件的 CellValidating 事件。所以现在我需要找到一种不同的方法来跟踪单元格值何时更改。DataGridView 控件公开的另一个事件是否更适合此目的?或者也许有一个 BindingList 事件可以帮助我实现这个功能?如果必须,我可以向我的业务对象添加一个布尔“已修改”属性并根据需要进行更新。如果可以避免这种情况,我想这样做是因为 BindingLists 之一在任何给定时间都包含 150,000 个对象,并且迭代可能不会非常快。

4

1 回答 1

1

BindingSource 有事件。例如CurrentChanged事件在当前绑定的项目发生变化时发生。

于 2013-03-06T20:40:12.030 回答