【问题标题】:Getting the PropertyGrid CollectionEditor to work with Generic Sorted Lists让 PropertyGrid CollectionEditor 使用通用排序列表
【发布时间】:2013-03-08 18:58:12
【问题描述】:

我有一个仅用于数据结构的 C# 库项目;一些类像这样使用SortedList

SortedList<CustomItem1, CustomItem2> MySortedList;

然后我有一个单独的 Windows 窗体项目使用它使用 PropertyGrid 来编辑数据结构。除了CollectionEditor,一切都非常适合编辑;添加/删除按钮被禁用。我知道我需要实现 ICollection 或 IList 的非通用版本(我在这方面找到了不同的答案) - 但这样做会破坏我的大部分代码,这些代码依赖于 @ 独有的一些方法987654326@类型。

另外,我想让我的数据结构尽可能小,并且如果可能的话,我不希望库依赖于 WinForms 中的任何内容。

任何关于如何在 CollectionEditor 中为 SortedList 激活“添加/删除”按钮的想法、对相关问题或帮助文章、示例等的引用将不胜感激。

【问题讨论】:

  • 您删除的问题中哪些地方不够清楚:stackoverflow.com/questions/15167443/…
  • 这个问题没有得到正确的答案,或者至少不是我能理解的形式。您给出的答案似乎表明我必须创建自己的自定义集合类,该类不具有我需要的 SortedList 的任何属性。我觉得这可能是因为我没有正确地提出问题,所以我删除了它,以便我可以重新开始,希望这次能正确地提出问题。

标签: c# winforms propertygrid sortedlist collectioneditor


【解决方案1】:

CollectionEditor Class 的 MSDN 文档指出:

此编辑器可以编辑具有 Item 属性的集合。这 编辑器可以从 Item 中确定集合的类型 属性,如果存在的话。如果集合没有这个属性, 或者,如果您想提供不止一种类型的集合,您可以 覆盖此类的某些受保护成员以自定义 编辑器以支持其他类型的集合

另外,Collection Editor Example 文档指出:

如果您对集合使用强类型 IList 实现 属性,并且集合中的所有对象都属于同一类型, 您不需要自定义集合编辑器。在这种情况下,您可以依靠 在内置的 CollectionEditor 上作为属性编辑器,因为 CollectionEditor 从 Items 的类型推断对象类型 IList 实现的属性。您应该使用类型化的 尽可能收集。 但是,如果您使用集合,例如 ArrayList 作为控件集合属性的类型,你需要一个 自定义集合编辑器以指定集合项的对象类型

所以我认为 CollectionEditor 不能(开箱即用)与您的 OrderedList 一起工作。

您是否尝试过将 OrderedList 集合投影到 IList 集合中?

IList<CustomItem2> myList = mySortedList.Select(m => m.Value>).ToList();
// Or
IList<KeyValuePair<CustomItem1, CustomItem2>> myList = mySortedList.Select(m => m).ToList();

【讨论】:

  • 我已经考虑过了——但我不相信这会允许双向通信;即我所做的更改不会被保存......另外,我无论如何都不会更新密钥,至少不是我能想到的。
  • 投影将在列表中创建对现有对象实例的新引用。 CollectionEditor 对这些对象的状态所做的更改会影响 SortedList 集合引用的相同对象(除非它创建新对象)。或者,您可以创建一个代理对象来封装您的 SortedList 集合、实现 IList 接口并将 IList 调用转换为相应的 SortedList 调用。但是,如果您要遇到这么多麻烦,我只会按照 API 说明并“覆盖 CollectionEditor 类的某些受保护成员”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 2014-08-27
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多