【问题标题】:Completely disable CollectionEditor完全禁用 CollectionEditor
【发布时间】:2012-05-03 11:15:44
【问题描述】:

我在 PropertyGrid 中使用自定义动态类对象(此处发布的代码太多)。简而言之,它的作用是允许我在运行时从任意输入创建属性(在本例中为 XML,但这不是重点)。这些属性可以是任何类型,包括另一个自定义类,因此它们可以无限嵌套。

我遇到的问题是 PropertyGrid 将此类视为一个集合,并且在 Value 列中有一个按钮,可让您打开 CollectionEditor。这(除其他外)具有添加和删除按钮,这两个按钮都会从根本上破坏自定义类。与其试图让这两个复杂的系统很好地协同工作,我更愿意干脆完全禁用 CollectionEditor。我有另一个系统,它允许您查看类的子对象(通过将 PropertyGrid.SelectedObject 设置为子对象)并且它工作正常。我希望用户甚至没有看到 CollectionEditor 的选项,因为它似乎与这个系统完全不兼容。

理想情况下,我只想在“值”列中放置一个按钮,以便我可以捕获点击事件并自行处理,但这是可选的。我也不关心我是否只为有问题的行或整个 PropertyGrid 禁用 CollectionEditor。无论哪种方式我都没有使用它,所以任何使它无法访问的东西都会很好。

【问题讨论】:

    标签: c# propertygrid collectioneditor


    【解决方案1】:

    您是否尝试过派生自己的 CollectionEditor 并在其中重写一些方法/事件以使其形式不出现而直接返回而不做任何事情?

    然后您需要使用以下标记您的集合类型属性:

    [EditorAttribute(typeof(MyCollectionEditor), typeof(System.Drawing.Design.UITypeEditor))]
    

    当单击 PropertyGrid 中标记的集合属性的“...”按钮时,这将自动启动您的 MyCollectionEditor。

    您可能还需要继承 PropertyDescriptor 并覆盖 GetEditor 方法以返回您自己的 CollectionEditor。

    【讨论】:

    • 不确定这将如何工作 - 我不负责 CollectionEditor 的外观。我的代码中的任何地方都没有引用它。 (如果是,我就不会有这个问题——我只是让它根本不出现。)我怎样才能劫持 PropertyGrid 的默认行为,让它使用我自己的 CollectionEditor 而不是内置的?跨度>
    • 只需从 System.ComponentModel.Design.CollectionEditor 继承您自己的“MyCollectionEditor”,并使用 [EditorAttribute(typeof(MyCollectionEditor), typeof(System.Drawing.Design.UITypeEditor))] 标记您的集合类型属性
    • 嗯——这可能是前进的方向。然而,这个类是在运行时动态创建的这一事实使一切变得复杂——你不能将属性放在属性上,因为它没有任何属性。它使用一整套复杂的 PropertyDescriptors 并覆盖 GetProperties() 来给出自己的列表,所以它远没有像添加这样的装饰器标签那么简单。无论如何,在我再次开始工作之前,还需要一周左右的时间,我现在在项目的其他部分。我会告诉你情况如何。
    • 在这种情况下,您可以继承 PropertyDescriptor 并覆盖 GetEditor 方法以返回您自己的 CollectionEditor。
    猜你喜欢
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多