我正在开发一个包含许多不同表单和用户控件的winforms应用程序。是否有一个我可以实现的推荐模式,当表单/控件退出时以及应用程序关闭时,通知用户当前表单/控件上有未保存的更改?
答案 0 :(得分:1)
Memento 是一种封装可撤消更改的方法。
然后,您可以记录未提交的memento实例。
但这通常是复杂的方式。
州通常最好。
您的应用程序有两种“更改”状态:已保存所有更改,未保存的更改。
每个州都有一个基于“更改”和“保存”方法的转换规则。
“保存”的“保存所有更改”实施不执行任何操作。
“保存”的未保存更改实施将状态设置为“已保存所有更改”。
Saved All Changes实施“更改”将状态设置为未保存的更改。
“更改”的未保存更改实施不执行任何操作。
答案 1 :(得分:1)
我正在使用LLBL Gen pro作为ORM,因此在对象中内置了一些良好的实体跟踪。 我有点自己动手,看起来效果很好。 我创建了一个新的界面,我的基本用户控件和基本表单实现了:
public interface IClosingNotification
{
/// <summary>
/// True if there is a dirty entity (or a dirty entity in the collection) present
/// </summary>
bool DirtyEntityPresent { get; }
/// <summary>
/// Register an entity to be watched for changes
/// </summary>
/// <param name="entity"></param>
void RegisterForClosingNotification(IEntity entity);
/// <summary>
/// Register a collection to be watched for changes
/// </summary>
/// <param name="collection"></param>
void RegisterForClosingNotification(IEntityCollection collection);
/// <summary>
/// Returns true if the form should close without any notification
/// </summary>
/// <returns></returns>
bool ShouldClose();
}
在我的基本控件/表单中,我有一组我在每个表单上看到的实体,并且我在这些类中有一个CloseForm()方法,我在表单关闭时使用它。 在我的表单中,每当我创建一个对象时,我都可以使用以下命令将其注册为关闭通知: RegisterForClosingNotification(MyCustomer);
在我们的场景中效果很好。