问题标签 [bindinglist]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1647 浏览

c# - 为什么 BindingList 添加成员时会抛出 System.ArgumentException

我有一个绑定列表,在某些难以重现的条件下,当向其中添加值时会引发以下异常:

System.ArgumentException:复杂 DataBinding 接受 IList 或 IListSource 作为数据源。在 System.ComponentModel.ReflectPropertyDescriptor.SetValue(Object component, Object value)
在 System.Windows.Forms.Binding.SetPropValue(Object value)
在 System.Windows.Forms.Binding.PushData(Boolean force)
在 System.Windows.Forms。 System.Windows.Forms.CurrencyManager.CurrencyManager_PushData() 上 System.Windows.Forms.CurrencyManager.OnItemChanged(ItemChangedEventArgs e)上 System.Windows.Forms.BindingManagerBase.PushData
( ) 上的BindingManagerBase.PushData(Boolean&success) 。 Forms.CurrencyManager.List_ListChanged(对象发送者,ListChangedEventArgs e)



在 System.ComponentModel.ListChangedEventHandler.Invoke(Object sender, ListChangedEventArgs e)
在 System.ComponentModel.BindingList 1.InsertItem(Int32 index, T item) 在 System.Collections.ObjectModel.Collection`1.Add(T item) ...1.OnListChanged(ListChangedEventArgs e)
at System.ComponentModel.BindingList


我可以理解它是在创建列表时发生的,还是在更改其中一个属性时发生的,但这只发生在向它添加某些值时。它声明如下:

然后像这样稍后使用(这是抛出异常的地方):

更糟糕的是,这发生在以前工作的生产代码中,这里涉及的代码最近都没有被编辑过。我怀疑这是某种微妙的数据交互问题,这也是它很少发生的原因,但坦率地说,我很茫然,因为异常的起源点在 .Net 内部深处。

更新:它实际上不是单个表单,而是用于支持多个表单/对话框的对象模型的一部分。这是非常复杂的代码,而不是我编写的代码,只是在维护/增强。深入研究代码后,似乎 BindingList 被添加到更多域对象中,并最终用于使用对象的字符串属性填充 ImageListBox。有问题的字符串不应为空或空白,但由于代码所在的位置以及难以重现附加调试器验证的错误将是有问题的。空值是否会导致 BindingList 在问题实际所在位置如此遥远的位置引发异常?在最终将其作为数据源分配给相关的 ImageListBox 列表之前,该对象实际上被插入到 3 个或 4 个其他对象/集合中(即使这样,它也取决于其他几个选择,以确定最终是哪个 BindingList 对象用于填充列表)。

0 投票
2 回答
30856 浏览

c# - 绑定列表.Sort() 表现得像一个列表。种类()

我正在尝试编写一个可用于我的应用程序的 SortableBindingList。我发现了很多关于如何实现基本排序支持的讨论,以便 BindingList 在 DataGridView 或其他一些绑定控件的上下文中使用时进行排序,包括来自 StackOverflow 的这篇文章:
DataGridView sort and eg BindingList<T> in .NET

这一切都非常有帮助,我已经实现了代码、测试等,并且一切正常,但在我的特定情况下,我需要能够支持对 Sort() 的简单调用,并让该调用使用默认的 IComparable。 CompareTo() 进行排序,而不是调用 ApplySortCore(PropertyDescriptor, ListSortDirection)。

原因是因为我有相当多的代码依赖于 Sort() 调用,因为这个特定的类最初继承自 List,最近被更改为 BindingList。

具体来说,我有一个名为 VariableCode 的类和一个名为 VariableCodeList 的集合类。VariableCode 实现了 IComparable 并且其中的逻辑基于几个属性等而适度复杂......

我在 Sort() 中重新利用 ApplySortCore 方法进行了几次失败的尝试,但一直阻碍我的是 ApplySortCore 期望 PropertyDescriptor 进行排序,我不知道如何让它使用 IComparable .CompareTo() 逻辑。

有人可以指出我正确的方向吗?

非常感谢。


编辑:这是基于 Marc 的响应的最终代码,以供将来参考。

0 投票
5 回答
8606 浏览

c# - 为什么我不能投射 IEnumerable列表到 BindingList?

是否可以将 IEnumerable 列表转换为 BindingList 集合?

IEnumerable 列表是类型化对象的列表,例如:

而我的 PagingList 只是扩展了 BindingList:

我只是想将我的 IEnumerable 列表传递给一个使用 PagingControl 呈现列表的方法:

但似乎我不能在两者之间进行转换,谁能指出我错过了什么?!

非常感谢

0 投票
1 回答
1925 浏览

c# - BindingList 内存泄漏

我的应用程序使用从 Bindinglist 继承的自定义列表,然后绑定到所有 UI 控件。该列表是实现 INotifyPropertyChanged 的​​基本对象的集合。我怀疑内存泄漏并使用 memprofiler 对我的应用程序进行了分析,这确认我的所有列表都从未被释放,并且它们一直在坚持,因为它们订阅了 bindinglist 的 propertyChanged 事件处理程序。

这是我的对象的样本

这是分析器中的分配堆栈

有人可以帮我处理清单吗?

谢谢大家


亨克,你是对的。问题不在于我提到的代码,而是我将其范围缩小到阻止我的表单被处理的代表。我正在制作一个样本来复制我将上传到网站的问题。谢谢

0 投票
3 回答
1050 浏览

c# - 创建可以绑定到 DataGrid 的自定义集合

我在一家建筑公司工作,我正在为 3D 建模程序创建一个插件来协助设计。我有一个建筑类和一个地板类。该建筑物包含对FloorList楼层集合的引用。我试图弄清楚FloorList集合的基础是什么,以便我可以最大限度地减少创建一个编辑集合的界面所需的工作量。

Floor系列代表了一系列相互堆叠的建筑楼层。每个楼层都有一个可读写的 Floor.Height 属性和一个只读的Floor.Elevation属性,该属性通过合计低于当前楼层的楼层高度来设置。因此,每当在集合中添加、删除、移动或更改楼层时,都需要更新Floor.Elevation属性。

另外,我想创建一个 UI 来编辑这个集合。我正在考虑使用DataGrid控件,其中每个楼层都列出了它的高度和其他属性作为控件的一行。用户应该能够使用控件添加、删除和重新排序楼层。我希望将其设置为尽可能简单和灵活。这意味着我希望能够简单地将 Floors 的集合绑定到DataGrid并根据Floor的属性填充DataGrid的列班级。如果可能的话,我希望能够利用 DataGrid 控件的内置添加/删除 UI 界面,而不必在我的集合和DataGrid之间设置一堆事件关系。

为了在将来使事情变得更复杂,我需要能够允许用户动态地将自定义属性添加到我希望他们能够在DataGrid中查看和编辑的楼层。我想我最终会通过让Floor类实现IExtenderProvider来做到这一点。所以最终DataGrid看起来像这样:

我现在的问题是我应该以什么为基础来实现FloorList集合以实现此功能?我正在考虑的选项如下。

1)从列表继承(楼层)

  • 诸如添加/删除之类的方法不是虚拟的,因此我不能不覆盖它们来更新海拔

2) 实现 IList(Floor)

  • OnChange 事件未内置,因此如果列表更改 DataGrid 将不会更新(我认为?)

  • 我认为这可能是最好的选择,但我需要做些什么来确保对FloorList集合或DataGrid的更改彼此同步?

3) 继承自 BindingList(Floor)

  • 添加/删除之类的方法不是虚拟的,因此我无法修改它们以更新楼层标高。

4) 实现 IBindingList

  • IBindinglist 不是通用的,我只希望我的集合包含Floor对象
0 投票
1 回答
1815 浏览

datagridview - BindingList 在哪里/何时/如何将 PropertyChanged 转换为 ListChanged 事件

我有一个全部实现 INotifyPropertyChanged 的​​对象层次结构。我还有一个从 BindingList 派生的自定义列表。

我的理解是,当我向列表中添加一个将 INotifyPropertyChanged 引入元素的对象时,PropertyChanged 事件会以某种方式自动连接/转换为 ListChanged 事件。

但是,在我将列表设置为 DataGridView 的数据源后,当我更改网格中的值时,ListChanged 事件不会触发......当我进入代码时,事实证明 PropertyChanged() 事件不是触发是因为它为空,我认为这意味着它没有连接/转换为 BindingList 的 ListChanged 事件,就像它应该...

例如:

这是我的自定义列表类...

有什么想法或建议吗?

谢谢!

乔什

0 投票
1 回答
4865 浏览

c# - 从 DataTable 到 BindingList

我正在从 DataTable 切换到 BindingList。我将 DataTable 绑定到 DataGrid 对象。

这是我的困境:虽然我当然看到了转换的好处,但我的情况会使它有点复杂,我想知道转换是否值得。

我的场景:我有一个显示化学样品的 DataGrid。有 5 种样本类型,每种类型的网格中的列会有所不同(有时基于其他参数在同一类型内)。有些列保持不变,有些存在 3 种类型,有些存在 4 种等等。不完全是简单继承的情况。目前,我有一个 DataTable,这很容易,因为我可以加载我想要的任何列,而不必为每个样本类型设置属性,如果我使用 BindingList,我将不得不这样做。但是,BindingList 将使以后更容易引用示例属性。

这是我对这个对象(BindingList)的第一次体验,所以欢迎提出任何建议。据我所知 BindingList 绑定到属性。所以如果我有:

如果我有类似的东西,网格将绑定到 Sample 类的属性

这意味着我将有 6 种类型的样本,所有样本都定义了属性。最终的继承结构可能很复杂,所以我想知道它是否值得。欢迎任何反馈。

我正在使用 c# 2.0;它是一个 Windows 应用程序。

0 投票
1 回答
779 浏览

c# - BindingList 和列的灵活性

每个人都对 BindingList 代替 DataTable 赞不绝口。

你们是如何克服色谱柱灵活性的问题的?对于 BindingList 我需要定义和实现 T 对象。如果需要添加任何新列,我需要向 T 对象添加新属性....而在 DataTable 中这要容易得多。

这是你生活的东西,还是有一种相对简单的方法来克服它?

使用 c# 2.0,紧凑的框架。

0 投票
3 回答
7736 浏览

c# - 绑定到 BindingList- 选择绑定什么?

假设我有一个名为 Sample 的业务对象,并且我有 Samples 的 BindingList。一个样本有 4 个属性。

我可以选择哪些属性绑定到 DataGrid 或者没有选项来自定义这样的东西?

注意:我使用的是 Compact Framework,其中没有 DataGridView,以及 Autogenerate 属性和 DataMember 属性。

请在回复时记住这一点。

0 投票
3 回答
726 浏览

c# - c# 2.0(BindingList)中与泛型缺乏协方差的解决方案

这是一个设计问题。我有一个业务对象,以及从它派生的 5 个业务对象类型。

我还将有一个以 BindingList 作为成员的类。我将有 5 个类派生自它。

由于协方差在这里不起作用,您将如何构建设计以最大程度地减少代码重复?我当然可以放弃 BindingList 并使用 DataTable,在这种情况下问题就解决了。

但是由于每个人都对 BindingList 赞不绝口,我很想看看你们会如何处理这个问题。

解决方案(基于 Pavel Minaev 的回答):