使用IList <control>类型的UITypeEditor的用户控件抛出异常“控件未标记为可序列化”</control>

时间:2012-10-16 20:03:35

标签: .net serialization typeconverter uitypeeditor

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

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

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初始化一个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);
}

}

1 个答案:

答案 0 :(得分:0)

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