这可能是软件设计或模式问题。
使用 LINQ to SQL 的 C# WinForms 解决方案。 有一个表单允许用户编辑 Customer 对象的属性值。
如果用户想要创建新客户,则表单将传递给新客户。
如果用户想要编辑现有客户,则表单将传递到现有客户。
当用户尝试关闭表单时,系统会检查是否需要保存对属性值的编辑,并提示用户保存更改:
protected Boolean CanExit()
{
Boolean isSaveNeeded = false;
String message = String.Empty;
if (dataContext.GetChangeSet().Updates.Contains(lookupObject))
{
message = "Save your changes before closing?";
isSaveNeeded = true;
}
else if (dataContext.GetChangeSet().Inserts.Contains(lookupObject))
{
message = String.Format("Save new {0} before closing?", lookupSingularName);
isSaveNeeded = true;
}
if (isSaveNeeded && XtraMessageBox.Show(message, "Close Form", MessageBoxButtons.YesNo, MessageBoxIcon.None, MessageBoxDefaultButton.Button1) == DialogResult.Yes)
{ return ActionSave(); }
else
{ return true; }
}
这有两个问题:
提示未设置属性的新客户保存。
如果用户编辑了属性值,然后将该值更改回其原始值,则提示保存
我有一个使用 ADO“原始值”解决这两个问题的模式。
使用 DataContext 解决问题的最佳方法是什么?
您可以使用 Memento 设计模式轻松解决它,(这样您可以比较对象 - 编辑前后)
您可以在此处查看维基详细信息。
https://en.wikipedia.org/wiki/Memento_pattern
并且可以查看纪念品上的文章。
http://www.codeproject.com/Articles/186184/Memento-Design-Pattern
您的客户对象应该实现 IEquatable。
在操作员开始编辑现有客户之前,请记住原始客户。在 CanExit 中,使用编辑后的数据创建一个 Customer 对象,并与原始客户进行比较,看看是否发生了变化,因此必须保存。当进行一些更改并改回来时,这将解决问题。
如果创建了新客户,则原客户为空。
public class Customer : IEquatable<Customer>
{
...
}
public class FormEditCustomer : ...
{
public Customer OriginalCustomer {get; set;}
private bool CanExit()
{
Customer editedCustomer = GetEditedData();
if (this.OriginalCustomer == null)
{ // new customer
return ProcessNewCustomer(editedCustomer);
}
else
{ // existing customer
if (!this.OriginalCustomer.Equals(editedCustomer))
{ // customer changed
return ProcessChanges(editedCustomer);
}
else
{ // no changes:
return RestoreCustomer(this.originalCustomer); // only if useful
}
}
}
}
如何判断新创建的对象是否有用户设置的属性值
可能要做的一件事是:
在进行任何更改之前制作对象的临时副本。
如果需要保存(用户按下save按钮或尝试关闭编辑窗口),那么我们应该验证他填写表单的数据。如果此数据包含一些无效值,那么我们需要提醒用户并让他再次编辑数据。数据验证后,应将其与初始数据进行比较,如果不同则必须保存。
关于以下内容:
class Customer
{
//...... your logic
public static bool operator ==(Customer x, Customer y)
{
return true; // add your logic for comparison here
}
public static bool operator !=(Customer x, Customer y)
{
return false; // add your logic for comparison here
}
}
让 myCustomer 将成为您要添加/编辑的对象
Customer temp = null;
if(myCustomer != null) temp = new Customer() { Id = myCustomer.Id, Name = myCustomer.Name ......... }
// add some logic to return user into edit form until it has valid values
while(!ValidateForm(myCustomer)) myCustomer = UIEditCustomer();
if(temp == null || myCustomer != temp) PromptToSave();
替换为 ORM(DevExpress XPO)
ORM 使 OO 开发变得更加容易