设置绑定源后,检查数据是否已更改

时间:2014-11-11 08:18:19

标签: c# winforms data-binding dto

我使用绑定源,以便所有控件都绑定到数据源。像这样:

var category = categoryRequest.Get(id);
bindingSource.DataSource = category;

这很好用。

我还在DTO类上实现了INotifyPropertyChanged(即使不应该这样做),因此对象属性的更改会立即反映在相应的控件中。这也有效。

但是,如果用户加载一个对象,更改某些控件中的某些文本并决定关闭该表单,我想确定数据是否已更改并提示"您确定吗?"消息。

目前,我这样做的方式是这样的:

    public static bool DataChanged(this Form form)
    {
        bool changed = false;

        if (form == null)
            return changed;

        foreach (Control c in form.Controls)
        {
            switch (c.GetType().ToString())
            {
                case "TextBox":
                    changed = ((TextBox)c).Modified;
                    break;

                //Other control types here...
            }

            if (changed)
                break;
        }

        return changed;
    }

但我不认为这是最好的方法,因为:

  1. 每种控件类型都需要手动添加
  2. 检查列表是否已更改
  3. 有没有更好的方法来实现我的需求?

3 个答案:

答案 0 :(得分:0)

您只想检查一次吗?就像关闭窗口之前一样..如果你这样做,你可以

在表单类中声明public static bool changed=false;,并将其值更改为true,其中包含INotifyPropertychanged。

您可以在表单中的任何位置显示消息框,如下所示。

     if(changed)
     {
        if (MessageBox.Show("Are you sure?","some caption",MessageBoxButtons.YesNo)==DialogResult.Yes)
        {
                //Do this if user presses YES
        }
      }

答案 1 :(得分:0)

只需订阅BindingSource的ListChanged事件,并根据事件设置IsDirty标志。

categoryBindingSource.ListChanged + = new System.ComponentModel.ListChangedEventHandler(categoryBindingSource_ListChanged);

并在事件方法中设置IsDirty = true ...

void customerAccountBindingSource_ListChanged(object sender,system.ComponentModel.ListChangedEventArgs e)         {             if(e.ListChangedType == System.ComponentModel.ListChangedType.ItemChanged)                 _isDirty = true;

    }

答案 2 :(得分:0)

我意识到这是一个较旧的主题,但我建议一个简单的解决方案:

if (YourTextBox.Modified)
{
    // Your code goes here.
}

我认为它自版本1.0以来就存在。您可以找到更多信息here