All*_*ice 16 c# data-binding bindingsource winforms
我有一个BindingSource我在winforms数据绑定中使用的东西,我想在用户尝试在对数据进行更改后关闭表单时提供某种提示.有点"你确定要退出而不保存更改吗?"
我知道,我可以通过这样做BindingSource的CurrencyManager.ItemChanged通过只是翻转'改变’布尔事件.
但是,我想要一个更强大的功能. 我想知道当前数据何时与原始数据不同. 该事件只是告诉我是否有些事情发生了变化.用户仍然可以更改属性,点击撤消,我仍然认为要保存的数据有变化.
我想模仿记事本的这种类似功能
如果这是不可能的,那么我应该使用ItemChanged上面概述的事件处理程序还是有更好的方法?
为了记录,我正在寻找类似的东西
bool HasChanged()
{
return this.currentState != this.initialState;
}
Run Code Online (Sandbox Code Playgroud)
不是这个
bool HasChanged()
{
// this._hasChanged is set to true via event handlers
return this._hasChanged;
}
Run Code Online (Sandbox Code Playgroud)
我只是不需要自己管理当前状态和初始状态,我正在寻找一种方法来获取信息,BindingSource 如果我可以从BindingSource它的方式获得此功能更理想,因为我将能够使用许多不同数据源的功能,无论类型如何等.
您必须INotifyPropertyChanged从对象类中实现接口,然后通过DataSource BindingSource属性中类型类的适当事件处理程序在发生更改时捕获。
提供您需要的一个对象是DataSet,包含持久实体的原始和当前(已更改)状态。然后,当一个取消时,您只需要调用该Rollback()方法。当一个人接受更改时,调用该AcceptChanges()方法即可。
除此之外DataSet,也许考虑像 NHibernate 这样的 ORM 可以为您完成这项工作,另外还允许您使用自定义定义的对象,而不是DataSet. ISession在表单中保持API 处于活动状态将允许 ISession 跟踪您对任何对象所做的更改,只要 NHibernate 知道它。
实现该INotifyPropertyChanged接口的另一个解决方案是在属性设置器中,您可以在私有字段或对象的每个属性中存储原始值。您可以简单地创建一个抽象类,该类的HasChanges属性返回每个属性是否为其原始状态,然后相应地返回 true 或 false。
我有一个关于我们有趣的初步讨论的问题。我只想确定一件事。如果我们愿意,我们称之为语言障碍。但是PropertyChanged通过INotifyPropertyChanged接口发布事件也会以某种方式将对象“回滚”到其原始状态。您必须注意的唯一细节是,如果用户说他不想保留更改,则通过BackgroundWorker类从底层数据库重新加载这个 CurrentItem并完成!没有滞后于您的 GUI,您的用户已取消更改,并且您将对象重置为其默认/原始状态!
好吧,我想这里有足够的细节来让自己成为一个想法,再加上其他人提供的所有其他好的答案。我相信你会找到自己的方式来完成你想要的。
最好的成功!=)