Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 完全禁用CollectionEditor_C#_Propertygrid_Collectioneditor - Fatal编程技术网

C# 完全禁用CollectionEditor

C# 完全禁用CollectionEditor,c#,propertygrid,collectioneditor,C#,Propertygrid,Collectioneditor,我在PropertyGrid中使用了一个自定义动态类对象(这里的代码太多了)。简而言之,它允许我在运行时从任意输入创建属性(在本例中为XML,但这不重要)。这些属性可以是任何类型,包括另一个自定义类,因此它们可以无限期嵌套 我遇到的问题是PropertyGrid将这个类视为一个集合,并且在Value列中有一个按钮,允许您打开CollectionEditor。这个(除其他外)有添加和删除按钮,这两个按钮都将从根本上打破自定义类。与其尝试让这两个复杂的系统很好地协同工作,我宁愿完全禁用Collect

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

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


理想情况下,我只想在Value列中放置一个按钮,以便捕获单击事件并自行处理,但这是可选的。我也不在乎是否仅对相关行或整个PropertyGrid禁用CollectionEditor。我不会用任何方法,所以任何使它不可访问的方法都是好的。

您是否尝试派生您自己的CollectionEditor,并在其中重写一些方法/事件,使其形式不出现,只返回而不做任何操作

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

[EditorAttribute(typeof(MyCollectionEditor), typeof(System.Drawing.Design.UITypeEditor))]
单击PropertyGrid中标记的集合属性的“…”按钮时,将自动启动MyCollectionEditor


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

您是否尝试派生您自己的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))]嗯-这可能是一个方向。但是,这个类是在运行时动态创建的,这一事实使一切都变得复杂了-你不能在属性上添加属性,因为它没有任何属性。它使用了一整套复杂的PropertyDescriptor并覆盖了GetProperties()给它自己的列表,所以它远没有添加那样的装饰标记那么简单。无论如何,在我再次开始这方面的工作之前还需要一周左右的时间,我现在正在处理项目的其他部分。我会让你知道这是如何进行的。在这种情况下,你可以继承PropertyDescriptor并重写GetEditor方法以返回你自己的ColleActionEditor。不确定该如何工作-我不负责CollectionEditor的外观。它在我的代码中的任何地方都没有引用。(如果是,我就不会有这个问题-我只会让它根本不出现。)如何劫持PropertyGrid的默认行为,使其使用我自己的CollectionEditor而不是内置的CollectionEditor?只需从System.ComponentModel.Design.CollectionEditor继承您自己的“MyCollectionEditor”,并使用[EditorAttribute(typeof(MyCollectionEditor),typeof(System.Drawing.Design.UITypeEditor)标记您的集合类型属性即可)]嗯-这可能是一个方向。但是,这个类是在运行时动态创建的,这一事实使一切都变得复杂了-你不能在属性上添加属性,因为它没有任何属性。它使用了一整套复杂的PropertyDescriptor并覆盖了GetProperties()给它自己的列表,所以它远没有添加那样的装饰标记那么简单。无论如何,在我再次开始这方面的工作之前还需要一周左右的时间,我现在正在处理项目的其他部分。我会让你知道这是如何进行的。在这种情况下,你可以继承PropertyDescriptor并重写GetEditor方法以返回你自己的Colle编辑。