如何判断新创建的对象是否有用户设置的属性值

问题描述 投票:0回答:4

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

使用 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; }
 }

这有两个问题:

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

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

我有一个使用 ADO“原始值”解决这两个问题的模式。

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

c# winforms linq datacontext
4个回答
0
投票

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

您可以在此处查看维基详细信息。

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

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

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


0
投票

您的客户对象应该实现 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
            }
        }
    }
}

0
投票

如何判断新创建的对象是否有用户设置的属性值

可能要做的一件事是:

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

如果需要保存(用户按下

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

0
投票
我解决了这个问题 - 通过不使用 Linq to SQL

替换为 ORM(DevExpress XPO)

ORM 使 OO 开发变得更加容易

© www.soinside.com 2019 - 2024. All rights reserved.