取消对Datagridview绑定到自定义类的更改

时间:2015-04-07 21:48:47

标签: c# winforms datagridview

我一直在研究这个主题几个小时,似乎无法找到解决方案或合理解释为什么它不起作用。我找到了类似的帖子,但没有一个解决我正在寻找的问题。 This帖子帮助我了解它的工作原理。我甚至能够使用TextBox成功测试它。问题是我想要DataGridview的这个功能。我想在DataGridView中进行更改,但在单击“确定”按钮之前不更新列表。我一直在使用这个测试设置:

简单的课程:

public class Person
{
  public int Age { get; set; }
  public int Height { get; set; }

  public Animal(int age, int height)
  {
     Age = age;
     Height = height;
  }
}

我像往常一样设置数据绑定。我的Form构造函数的片段:

public Form1()
{
  InitializeComponent();
  People = new List<Person>();
  personBindingSource.DataSource = People;
  personBindingSource.RaiseListChangedEvents = true;
  dataGridView1.AutoGenerateColumns = true;
  dataGridView1.DataSource = personBindingSource;
  dataGridView1.DataBindings.DefaultDataSourceUpdateMode = DataSourceUpdateMode.Never;
 }

我用值编辑单元格,然后有一个调用Binding.WriteValue()的按钮。基础数据源不断自动更新单元格更改(表现得像OnValidation,即使我已经做到了它从来没有字面上我能想到的任何地方)。是否有我遗漏的东西,或者我将不得不手动实现这个?

1 个答案:

答案 0 :(得分:0)

所以我想没有开箱即用的方法来完成我正在寻找的东西。我决定自己实施一些对我有用的东西。基本上它是memento pattern,其语法类似于DataTable可用的语法(即DataTable :: RejectChanges())。我为这样的通用列表创建了一个容器:

public class ApplyCancelList<T>
{
    List<T> snapshot = null;

    public List<T> List { get; private set; }

    public ApplyCancelList()
    {
        List = new List<T>();
    }

    public void CreateMemento()
    {
        snapshot = new List<T>(List);
    }

    public void RejectChanges()
    {
        List = new List<T>(snapshot);
    }
}

在每个表单上加载我创建一个纪念品。如果调用Apply,则快照将更新为已接受的列表。如果调用取消,我将恢复快照。当我重置绑定源的数据源时,Datagridview会更新。我不确定这个解决方案有多优雅/高效,但它给了我想要的行为。如果有人在任何地方看到我可以改进,请毫不犹豫地发表评论。