首页 > 解决方案 > 要求用户保存数据代码审查

问题描述

当用户点击退出表单并且数据未保存时,我想问用户他是否要保存数据。下面的代码可以更简化,更容易阅读这个方法 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 中,就像在询问用户之前一样,那么它只会取消我当然不想要的关闭。如果您想到一些,请分享您的解决方案。谢谢你。

标签: c#

解决方案


这更像是一个代码审查问题。

您编码的方式是将逻辑代码与 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
   }
}

这使表示层和逻辑层保持分离。


推荐阅读