【问题标题】:Cancel Changes to Datagridview Bound to Custom Class取消对绑定到自定义类的 Datagridview 的更改
【发布时间】:2015-04-07 21:48:47
【问题描述】:

我一直在研究这个主题几个小时,但似乎无法找到解决方案或合理解释它为什么不起作用。我找到了类似的帖子,但没有一个解决我正在寻找的内容。 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;
  }
}

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

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 一样,从来没有在我能想到的任何地方实现)。有什么我遗漏的,或者我必须手动实现吗?

【问题讨论】:

  • @rob 我确实遇到过。问题是 CancelEdit 仅适用于当前的编辑操作。我不一定要寻找一种方法来编辑每个编辑操作。更重要的是,我只需要 datagridview 就像我的文本框示例一样。我可以根据需要多次编辑文本框,但在执行 WriteValue() 之前,这些值不会传播。谢谢你的评论

标签: c# winforms datagridview


【解决方案1】:

所以我想没有一种开箱即用的方式来完成我正在寻找的东西。我决定自己实现一些对我有用的东西。基本上它是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 会更新。我不确定这个解决方案有多优雅/高效,但它给了我想要的行为。如果有人看到我可以改进的地方,请不要犹豫。

【讨论】:

    猜你喜欢
    • 2011-07-28
    • 2016-04-26
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 2012-03-07
    相关资源
    最近更新 更多