2

我正在尝试向我的用户控件类型添加一个属性IList<Control>,并且我已经实现了一个 UITypeEditor 来向用户显示表单中控件的 CheckedListBox 并允许用户识别要包含的控件。到目前为止,这工作正常。

但是当我尝试关闭 UITypeEditor 时,设计器会显示一条消息“属性值无效”,其中包含以下详细信息:

Type 'System.Windows.Forms.Control' in Assembly 'System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' is not marked as serializable.

我不确定这是否可以通过 TypeConverter 解决,但如果是,我不确定 TypeConverter 应该从该ConvertTo方法返回什么(因为您无法从构造函数初始化 List,并且它需要引用我不确定如何传回的控件)。

如有必要,我可以将类型更改为 Control[] 如果这样可以解决从构造函数初始化的问题。

编辑:我尝试了这个 TypeConverter,但尽管将它与用户控件上的属性相关联,但它似乎并没有以任何方式使用。

class ControlListConverter : TypeConverter {
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) {
    if (destinationType == typeof(InstanceDescriptor)) return true;

    return base.CanConvertTo(context, destinationType);
}

public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) {
    if (destinationType == typeof(InstanceDescriptor) && value is IList<Control>) {
        IList<Control> list = (IList<Control>)value;

        ConstructorInfo ctor = typeof(List<Control>).GetConstructor(new Type[] {typeof(IEnumerable<Control>)});

        if (ctor != null) {
            return new InstanceDescriptor(ctor, new object[] { list });
        }
    }

    return base.ConvertTo(context, culture, value, destinationType);
}

}

4

1 回答 1

0

似乎相对较好的解决方法是将属性更改为 IList 并存储控件名称。然后,当您需要访问控件时,您只需通过它们的名称查找每个控件。

于 2012-10-17T18:36:23.503 回答