我正在编写一个带标签的WinForms应用程序,它包含多个绑定到BindingSources的DataGridView控件。反过来,BindingSources绑定到业务对象的BindingLists。我的业务对象实现了INotifyPropertyChanged。
我的TabControl有三个TabPages(A,B和C)。如果我的用户对选项卡A上的DataGridView控件中的数据进行了更改,然后尝试切换到选项卡B或C而不提交更改(在这种情况下,将数据写入磁盘),我需要提示他们保存改变或失去它们。
为了确定是否对给定选项卡进行了更改,我为每个选项卡创建了“pendingChange”变量。每个DataGridView控件都有自己的CellValidating事件处理程序,我在用户进行更改时验证数据。在该事件处理程序结束时,如果更改已通过所有验证检查,则将该选项卡的pendingChange变量设置为true。当我的用户单击按钮将更改写回磁盘时,我重置了pendingChange变量。因此,只要我的用户尝试更改为其他选项卡,我都会检查此变量以确定是否有任何需要先保存的更改。
现在我意识到这个设计存在一个很大的缺陷,就是每次单元失去焦点时都会触发DataGridView控件的CellValidating事件。所以现在我需要找到一种不同的方法来跟踪单元格值何时被更改。是否有另一个DataGridView控件公开的事件更适合此目的?或者可能有一个BindingList事件可以帮助我实现这个功能?如果必须,我可以向我的业务对象添加一个布尔“modified”属性,并根据需要更新它。如果可以避免这种情况,我想,因为其中一个BindingLists在任何给定时间包含150,000个对象,并且迭代可能不会非常快。