c# - 要求用户保存数据代码审查
问题描述
当用户点击退出表单并且数据未保存时,我想问用户他是否要保存数据。下面的代码可以更简化,更容易阅读这个方法 SaveOrRejectChanges()。
private bool SaveOrRejectChanges()
{
if (MsgBox("do you want to save data") == true)
{
if (ValidateIsEmptyOrNullValue()) return false; //here I check is required field not entered
SaveChanges(); // if validation passes (data are entered), save it
}
else
RejectChanges(); // cancel changes by setting EntityState.Unchanged on DBContext for each entity
return true;
}
private void iExit_ItemClick(object sender, ItemClickEventArgs e)
{
_isFormClosing = true;
// close form if data are not modified (no saving required). Or close form when data are saved or changes are canceled
if (_isDataModified == false || SaveOrRejectChanges())
this.Close();
}
我仍然是初学者,所以请分享您的想法。我有点不喜欢嵌套的 if,但我不得不把它放在其他 if 中,就像在询问用户之前一样,那么它只会取消我当然不想要的关闭。如果您想到一些,请分享您的解决方案。谢谢你。
解决方案
这更像是一个代码审查问题。
您编码的方式是将逻辑代码与 GUI 代码混合。一个更好的方法是将表单控件绑定到一个类。
通过这种方式,您可以轻松地对业务逻辑进行单元测试,即使它只是验证和保存控件的状态。
另一个好处是,如果所有表单控件状态都保存在一个类中,您可以简单地将类序列化为 Json、XML、dB 等。
更新:
这是一个关于使用 BindingSource 控件的大型教程 - DataGridView、TextBox 和 ListBox 示例:https ://www.codeproject.com/Articles/24656/A-Detailed-Data-Binding-Tutorial 。
因此,您的逻辑已经在业务逻辑类中,但您仍然依赖于消息框。要解耦有一个 Action 方法或一个 EventHandler 来调用 GUI Form 类,请注意我手机上写的伪代码:
public class GUI {
public BusLogic BL = new BusLogic();
public GUI () {
BL.ShouldSaveData += Should_Save_Data;
}
public bool Should_Save_Data() {
DialogResult res = MessageBox.Show("do you want to save data", "", MessageBoxButtons.OkCancel);
return res.Ok == DialogResult.Ok;
}
private void iExit_ItemClick(object sender, ItemClickEventArgs e) {
_isFormClosing = true;
if (_isDataModified) BL.SaveOrRejectChanges();
}
}
在您的业务逻辑类中,您可以调用 ShouldSaveData() 事件。
public class BusLogic {
public event Action<bool> ShouldSaveData;
public void SaveOrRejectChanges() {
bool confirmSave = false;
if (ShouldSaveData != null) confirmSave = ShouldSaveData;
if (confirmSave) //DO YOUR SAVING HERE
}
}
这使表示层和逻辑层保持分离。
推荐阅读
- php - 通过 Docker 的 PHP Redis 连接 - 无法连接到 redis 容器(撰写设置)
- matrix - 增加apl中的数字
- python - 为什么以及何时创建虚拟变量在 python 项目中很重要?
- python - 使用 i2c 从 Raspberry Pi 读取 ADS1115 时出现问题
- typescript - Typescript - 深度类型合并,包括可选属性
- react-native - 超过最大更新。当组件在 componentWillUpdate 或 componentDidUpdate 中重复调用 setState 时,可能会发生这种情况
- c# - Winform使用lua控制鼠标
- node.js - 如何在 nodejs 应用程序中为 mailgun-js 创建带有玩笑的手动模拟?
- compiler-construction - 使用 Bazel 构建时如何发出 LLVM IR?
- python-3.x - groupby 在多个列上并应用各种功能