当用户单击以退出表单,并且数据未保存时,我想问用户他是否要保存数据。下面的代码可以更简化,以便于阅读此方法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内,就像在询问用户之前一样,然后它将简单地取消关闭,这当然是我不想要的。如果您有想法,请分享您的解决方案。谢谢。
答案 0 :(得分:1)
这更多是代码审查问题。
您的编码方式是将逻辑代码与GUI代码混合在一起。更好的方法是将窗体控件绑定到类。
通过这种方法,即使只是验证和保存控件的状态,您也可以轻松地对业务逻辑进行单元测试。
另一个好处是,如果所有“表单控件”状态都保存在一个类中,则只需将该类序列化为Json,XML,dB等即可。
更新:
有关使用BindingSource控件的大量教程,请参见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
}
}
这使表示层和逻辑层保持分离。
答案 1 :(得分:0)
我对代码进行了一些改进,这是重构版本:
private void AskToSaveChanges()
{
// note: MyMessageBox is a class in UI layer, because it uses UI component
// of Windows forms
if (MyMessageBox.Show(MyMessageBoxActions.Save, ""))
SaveChanges(); // this is done in Persistence layer
else
RejectChanges(); // this is done in Persistence layer
}
private void iExit_ItemClick(object sender, ItemClickEventArgs e)
{
_isFormClosing = true;
if (_isDataModified == false || AskToSaveChanges())
this.Close();
}