gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:26:22 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com