我有两个按钮 - 取消和添加,分别在 GridView 中添加一个新行,每次单击它时,都会将一条新记录添加到上下文中,该上下文连接到绑定(bind)源,绑定(bind)源设置为 GridView 的数据源。
因此,如果我有 2 行并添加 8 行(例如),当我单击取消时,它应该只会清除未保存的行并将它们再次保留为两行。
问题是它只取消了其中的 4 个(我可以在我的代码中看到问题,但我找不到修复它的方法)。
这是我的简单代码,目前还没有用:
try
{
DialogResult dialogResult = MessageBox.Show("Do you want to cancel all unsaved changes?", "Cancel all unsaved changes", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
for (var i = 0; i < bindingSource1.Count; i++)
{
var f = bindingSource1[i] as MyConfiguration;
if (f.MyConfigurationId == 0)
{
context.RemoveMyConfiguration(f);
bindingSource1.Remove(f);
}
}
}
}
catch (Exception ex)
{
throw ex;
}
问题是我遍历绑定(bind)源并同时删除元素并且它得到更新,所以在某些时候它可以看到它已经遍历了整个集合。
正确的做法是什么?我应该遍历网格中的行吗?
编辑:对此我深表歉意,这是 WinForms。 BindingSource
的数据源是来自数据库的List。我正在使用 Entity Framework 4.0。
最佳答案
您的问题只是您从正在迭代的列表中删除了项目。如果您从 BindingSources 列表中删除一个项目,它前面的项目将向后移动一个索引,这意味着您将跳过已重新定位到您从中删除该项目的索引的项目。
最简单的解决方案是将计数器的增量移动到 else block ,这样计数器只有在项目NOT 被删除时才会增加,否则您希望再次检查相同的索引,作为一个新项目现在占据了这个索引。
奖金信息:
我建议看一下 BindingList ,并考虑将其用作 BindingSource 的数据源,而不是普通的 List<T>
.将 BindingList 与绑定(bind)源结合使用的主要优点是绑定(bind)列表会在列表更改时触发事件,这些事件由绑定(bind)源订阅。这意味着您只需“担心”对您的 BindingList 实例进行更改 - 更改由绑定(bind)源获取并反射(reflect)在使用绑定(bind)源作为数据源的控件中。
Super-Mega-Jackpot-info:
如果您希望取消对 BindingSource 中的单个项目所做的更改(在 Current
属性中找到),您可以使用方法 CancelEdit .但要使其生效,绑定(bind)源中包含的对象类型需要实现 IEditableObject interface
关于c# - 如何取消绑定(bind)源中的所有更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26776250/