如何处理检查以查看用户是否在对话框中更改了某些内容

时间:2009-03-02 14:14:02

标签: .net winforms

在这里谈论.NET WinForms:

如果您的应用程序中有人可以使用某些属性对话框更改项目,例如,如何确定用户在单击取消时是否更改了某些内容(以决定是否显示取消确认消息框)

我可以想到两种方法:

  1. 定义脏位并处理所有“已更改”事件以将此位设置为true。
  2. 克隆原始对象并编写一些比较代码,以确定修改后的对象是否真的与原始对象相比进行了修改
  3. 还有更优雅和/或更通用的方法吗?

6 个答案:

答案 0 :(得分:1)

这两个选项都有效。

但请考虑以下事项:用户更改值,然后将其更改回原始值。

根据脏位方法改变它。但根据克隆和比较方法,它不是。所以这种方法是首选。

答案 1 :(得分:0)

我的DAL执行你在2中提到的内容。所以我可以盲目地将所有值分配回我的DAO,它将负责仅提交实际更改的值。

答案 2 :(得分:0)

实际上,在对话框中,单击取消应该只关闭对话框。单击确定/保存应保存所有更改。

因此,两种方法都存在轻微缺陷,因为他们假设您在用户单击“确定”之前更改了模型

我会做以下操作:将伪模型对象附加到对话框中。让更改反映在此对象中,然后在取消上将其废弃,或将其传递到保存上的DAL。如果您只在第一次更改时创建伪模型,那么为什么您可以使用取消确认对话框。

答案 3 :(得分:0)

如果您想知道是否有任何更改(特定于更改的内容),那么在您的对象上加载表单GetHashCode然后关闭时,再次致电GetHashCode,然后查看如果结果不同。

您需要覆盖对象中的GetHashcode函数:

Public Class Person


    Private _firstName as string = string.empty
    Private _lastName as string = string.empty
    Private _dob as Datetime = Date.MinVal
    private _weight as single = 0.0

    ...

    Public Overrides GetHashCode as Integer

        Dim sb as new System.Text.StringBuilder

        sb.append(_firstName)
        sb.append(_lastName)
        sb.append(_dob)
        ...
        sb.append(_weight)

        Return sb.ToString.GetHashCode

    End Function

End Class

这适用于我们的对象和DAL:)

HTH

答案 4 :(得分:0)

重新考虑要显示确认对话框的设计。确认箱在很大程度上是无用的,因为用户习惯于总是按“是的,这就是我的意思”。相反,如果用户在进行更改后取消,请为用户提供恢复该数据的机制。如果数据中的对话对于用户来说很难或者很耗时,这一点尤其重要,如果用户可以在几秒钟内重做他们的工作则不是那么重要。

要回答您的具体问题,我建议您选择(2)克隆该对象的地方。将原始数据与新数据进行比较是了解“数据是否已更改?”的最可靠方法。如果使用脏位概念,请确保处理用户更改值的情况,然后将其更改回来。通常要做到这一点,你必须保留原始版本的副本,所以你要回到保留原始对象的副本。有了原始对象的副本,比较两个对象可能比管理跟踪脏位更容易。

答案 5 :(得分:0)

就个人而言,我会选择选项2.创建克隆的“原始值”对象的成本将是最小的,除非您有非常多的字段,或者除非某些字段包含大型数据对象(大文本块) ,图像等。)。

一个关键的好处是,当用户更改值然后将其更改回来时,您不会得到“误报”。

此外,这将允许您实现重置功能,以便用户可以放弃所有更改,而无需取消并重新启动。

如果您不想维护完整的“克隆”,请考虑为更改的字段保存旧值。如果用户更改了一个,请将其从OldValues结构中删除。如果你有很多字段,这将使你的重置更快,因为你只需要恢复OldValues中存在的字段。