如何确定新创建的对象是否具有用户设置的任何属性值

时间:2015-08-21 04:51:43

标签: c# winforms linq datacontext

这可能是软件设计或模式问题。

使用LINQ to SQL的C#Wnforms解决方案。 有一个表单允许用户编辑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; }
    }

这有两个问题:

  1. 提示保存未设置属性的新客户。

  2. 如果用户编辑了属性值,则提示保存,然后将值更改回原始值

  3. 我有一个使用ADO' Original Values解决这两个问题的模式。

    使用DataContext解决问题的最佳方法是什么?

4 个答案:

答案 0 :(得分:0)

你可以使用Memento设计模式轻松解决它(这样你可以比较对象 - 编辑之前和之后)

你可以在这里查看维基详细信息。

https://en.wikipedia.org/wiki/Memento_pattern

可以查看纪念品上的文章。

http://www.codeproject.com/Articles/186184/Memento-Design-Pattern

答案 1 :(得分:0)

您的客户对象应该实现IEquatable。

在操作员开始编辑现有客户之前,请记住原始客户。在CanExit中,使用编辑的数据创建一个Customer对象,并与原始客户进行比较,以查看是否有更改,因此必须保存。这将解决在进行某些更改并进行更改后的问题。

如果创建了新客户,则原始客户为空。

current

答案 2 :(得分:0)

  

如何确定新创建的对象是否具有用户设置的任何属性值

一件可能的事情是:

在进行任何更改之前制作对象的临时副本。

如果需要保存(用户按保存按钮或尝试关闭编辑窗口),那么我们应该验证他填写表格的数据。如果此数据包含一些无效值,那么我们需要提醒用户并让他再次编辑数据。验证数据后,应将其与初始数据进行比较,如果不同,则必须保存。

以下内容:

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();

答案 3 :(得分:0)

我解决了这个问题 - 不使用Linq to SQL

替换为ORM(DevExpress XPO发生)

ORM使OO开发变得更加容易