我一直在研究这个主题几个小时,似乎无法找到解决方案或合理解释为什么它不起作用。我找到了类似的帖子,但没有一个解决我正在寻找的问题。 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,即使我已经做到了它从来没有字面上我能想到的任何地方)。是否有我遗漏的东西,或者我将不得不手动实现这个?
答案 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会更新。我不确定这个解决方案有多优雅/高效,但它给了我想要的行为。如果有人在任何地方看到我可以改进,请毫不犹豫地发表评论。