集合含Null项时CollectionEditor报错,PropertyGrid打开失败如何解决?
解决数组含Null项时PropertyGrid无法打开CollectionEditor的问题
问题出在默认CollectionEditor无法处理数组中的null元素,尝试读取null对象的属性时会触发“component”错误。通过自定义CollectionEditor并重写关键方法即可解决:
步骤1:自定义CollectionEditor
创建继承自CollectionEditor的自定义编辑器,处理null元素的转换:
using System.ComponentModel; using System.ComponentModel.Design; using System.Windows.Forms.Design; using System.Collections.Generic; public class TestCollectionEditor : CollectionEditor { public TestCollectionEditor(Type type) : base(type) { } // 确保能创建Test实例 protected override object CreateInstance(Type itemType) { return itemType == typeof(Test) ? new Test() : base.CreateInstance(itemType); } // 将数组中的null替换为临时Test实例,避免编辑器加载报错 protected override object[] GetItems(object editValue) { if (editValue is not Test[] array) return base.GetItems(editValue); var items = new List<object>(); foreach (var item in array) { items.Add(item ?? new Test { Name = "[未初始化]" }); } return items.ToArray(); } // 保存时将标记为[未初始化]的实例转回null protected override object SetItems(object editValue, object[] value) { if (editValue is not Test[] originalArray) return base.SetItems(editValue, value); var newArray = new Test[originalArray.Length]; for (int i = 0; i < value.Length; i++) { if (value[i] is Test item) { newArray[i] = item.Name == "[未初始化]" ? null : item; } } return newArray; } }
步骤2:为数组属性指定自定义编辑器
在test属性上添加Editor特性,指定使用自定义编辑器:
using System.ComponentModel; using System.Drawing.Design; public partial class Form1 : Form { [Editor(typeof(TestCollectionEditor), typeof(UITypeEditor))] public Test[] test { get; set; } public Form1() { InitializeComponent(); test = new Test[5]; test[2] = new Test() { Name = "2" }; propertyGrid1.SelectedObject = this; } } [TypeConverter(typeof(ExpandableObjectConverter))] public class Test { public string Name { get; set; } }
原理说明
默认CollectionEditor加载时会遍历数组元素并尝试读取其属性,null对象无法提供属性信息导致报错。自定义编辑器通过以下逻辑规避问题:
- 读取数组时,将null替换为标记了
[未初始化]的Test实例,让编辑器能正常加载元素 - 保存编辑结果时,将未修改的标记实例转回null,保留原有数组的null项逻辑
- 重写
CreateInstance确保编辑器能正常创建新的Test实例供用户添加
内容的提问来源于stack exchange,提问作者KageBunshin
相关产品推荐
相关产品推荐

