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 に答える