2012-10-16 45 views
2

我想添加一個屬性到我的用戶控件的類型IList<Control>,我已經實現了一個UITypeEditor來顯示用戶CheckedListBox控件的形式,並允許用戶確定要包含哪些控件。迄今爲止,這工作得很好。用戶控制與類型IList <Control> UITypeEditor引發異常「控制未標記爲可序列化」

但是,當我試圖關閉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應該從ConvertTo方法返回什麼(因爲你不能從構造函數初始化列表,它會希望引用控件,我不知道如何傳回)。

如果需要,我可以將類型更改爲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); 
} 

}

回答

0

的解決方法解決這個,似乎工作比較好是在屬性更改爲IList和存儲控制名稱代替。然後,當您需要訪問控件時,只需通過名稱查找每個控件即可。

相關問題