c# - 如何取消绑定(bind)源中的所有更改?

标签 c# winforms bindingsource

我有两个按钮 - 取消和添加,分别在 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/

相关文章:

c# - 主备 Web 服务器 ASP.Net Web 应用程序之间的故障转移

c# - 使用 WiX DTF 获取组件代码

c# - 在 Entity Framework 中使用 bindingSource 过滤器

c# 从 BindingSource 获取 DataTable 并编辑它

c# - C#支持多重继承吗?

c# - 将常规类库转换为 ASP.NET 5 (vnext)

c# - (c# + windows 窗体) 将项目添加到不同类中的 listBox

c# - (...) 在当前上下文中不存在 - 渐变和其他画笔

.net - 防止 WebBrowser 控件吞下异常

vb.net - 绑定(bind)源过滤