【问题标题】:How to catch user changes in databound controls?如何捕捉数据绑定控件中的用户更改?
【发布时间】:2009-12-28 20:12:02
【问题描述】:

我的应用程序充满了各种控件的数据绑定到我的类。我想问用户“您正在关闭应用程序并进行了一些更改。您要保存更改吗?”。为此,我需要识别用户进行了任何更改。

如何捕捉用户在数据绑定控件中所做的更改? textBoxXXX_TextChanged 是唯一的方法吗?

提前感谢您的所有回答。

【问题讨论】:

    标签: c# data-binding user-input


    【解决方案1】:

    这取决于数据源;例如 DataTable 和 DataSet 源包含GetChanges() 方法,这些方法使您可以轻松查看是否已添加/删除/修改行。其他数据源将有自己的实现(如果有)。如果没有实现,则由您决定如何检查这些更改。

    无论如何,这是您应该在数据级别而不是 UI 上执行的操作(通过监视“更改”事件)。观看事件的规模不会超出几个控制范围,而且维护可能很困难。


    更新:不知道为什么我没有想到它,但第二个选择是将BindingSource 添加到您的 UI 对象并将其用作数据绑定代理(您的 UI 控制数据绑定BindingSourceBindingSource 绑定到真实数据源)。它提供了一种比处理所有单独的“Control_Changed”事件更好的方法,并且需要对其他层进行返工(尤其是如果它们不是自定义数据类型)。

    【讨论】:

      【解决方案2】:

      您需要为此提供自定义逻辑,实际上并没有 自动 方式来执行此操作。在我看来,有几种选择:

      1. 在开始编辑时,保存一份原始数据对象的副本,当需要检查时,将当前对象与保存的对象进行比较。比较可以是自定义的(逐个字段)或使用序列化的半自动比较(比较序列化的表单) - 如果它是可序列化的。
      2. 在每个数据对象的属性集访问器中,测试值的变化并将对象标记为“脏”。

      【讨论】:

        【解决方案3】:

        如前所述,有很多方法可以做到这一点,具体取决于您想要获得的粒度。

        使用客户端 javascript 的一种相对简单的方法是执行以下操作:

        1. 挂钩到表单元素的onchange 事件。您可以使用 javascript/DOM 在页面加载时动态执行此操作。
        2. 当调用 onchange 错误处理程序时,您可以设置一个页面级变量:pageHasChanged = true;
        3. 挂钩页面的beforeonunload 事件(当用户试图离开页面时发生)并检查pageHasChanged 变量以查看是否进行了任何更改。如果进行了更改,您可以提醒用户。

        这不会为您提供更改的详细信息,但很容易修改以跟踪哪些表单元素发生了更改。

        【讨论】:

          猜你喜欢
          • 2020-06-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-29
          • 2011-08-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多