1

いくつかのプロパティを持つカスタムコントロールを作成しました。カスタムコントロールに拡張可能なプロパティを追加します。ここで、ユーザーがプロパティグリッドの展開可能なプロパティフィールドと、関連するプロパティに設定された新しい入力値を編集できるようにします。プロパティグリッドの拡張可能なプロパティは「必須の記号」であり、次の2つのサブプロパティがあります。

  1. ForeColor

  2. 見える

次の図に示すように、「RequiredSign」拡張可能プロパティの2つのサブプロパティの値を「RequiredSign」プロパティのフィールドに設定しました。

  1. 緑のボックス:「必要なサイン」拡張可能なプロパティ

  2. ブルーボックス:「必須記号」拡張可能プロパティの2つのサブプロパティ

  3. 赤いボックス:「必須記号」拡張可能プロパティのフィールド

ただし、「必須記号」拡張可能プロパティのフィールド値を直接変更または編集することはできません。拡張可能なプロパティ(図の赤いボックス)のフィールド値を変更または編集するにはどうすればよいですか?

私のコードは次のとおりです。

[DisplayName("Label Information")]
[Description("Label Informationnnnnnnnnnnnnnnn")]
[DefaultProperty("Text")]
[DesignerCategory("Component")]
[TypeConverter(typeof(AllFloorsContentsLabelInformationTypeConverter))]
public class AllFloorsContentsLabelInformation : LabelX
{
    private AllFloorsContentsLabelRequiredSignInformation allFloorsContentsLabelRequiredSignInformation = new AllFloorsContentsLabelRequiredSignInformation();

    public AllFloorsContentsLabelInformation()
    {

    }

    [Category("Data")]
    [DisplayName("Required Sign")]
    [Description("Required Signnnnnnnnnnnnnnn")]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public AllFloorsContentsLabelRequiredSignInformation AllFloorsContentsLabelRequiredSignInfo
    {
        get
        {
            return allFloorsContentsLabelRequiredSignInformation;
        }
    }
}

[DisplayName("Required Sign Information")]
[Description("Required Sign Informationnnnnnnnnnnnnnnn")]
[DefaultProperty("Text")]
[DesignerCategory("Component")]
[TypeConverter(typeof(AllFloorsContentsLabelRequiredSignInformationTypeConverter))]
public class AllFloorsContentsLabelRequiredSignInformation
{
    private Color foreColor = Color.Red;
    private ConfirmationAnswers visible = ConfirmationAnswers.Yes;

    public AllFloorsContentsLabelRequiredSignInformation()
    {

    }

    [Category("Appearance")]
    [DisplayName("ForeColor")]
    [Description("ForeColor")]
    [DefaultValue(typeof(Color), "Red")]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public new Color ForeColor
    {
        get
        {
            return foreColor;
        }
        set
        {
            foreColor = value;
        }
    }

    [Category("Behavior")]
    [DisplayName("Visible")]
    [Description("Visibleeeeeeeeeeeeeeeeee")]
    [DefaultValue(ConfirmationAnswers.Yes)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public ConfirmationAnswers Visible
    {
        get
        {
            return visible;
        }
        set
        {
            visible = value;
        }
    }
}

public class AllFloorsContentsLabelRequiredSignInformationTypeConverter : ExpandableObjectConverter//TypeConverter
{
    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    {
        if (destinationType == typeof(AllFloorsContentsLabelRequiredSignInformation))
        {
            return true;
        }
        return base.CanConvertTo(context, destinationType);
    }

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(String) && value is AllFloorsContentsLabelRequiredSignInformation)
        {
            AllFloorsContentsLabelRequiredSignInformation allFloorsContentsLabelRequiredSignInformation = (AllFloorsContentsLabelRequiredSignInformation)value;
            return allFloorsContentsLabelRequiredSignInformation.ForeColor.ToString() + "; " + allFloorsContentsLabelRequiredSignInformation.Visible.ToString();
        }
        return base.ConvertTo(context, culture, value, destinationType);
    }

    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        if (sourceType == typeof(string))
        {
            return true;
        }
        return base.CanConvertFrom(context, sourceType);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        if (value is string)
        {
            AllFloorsContentsLabelRequiredSignInformation allFloorsContentsLabelRequiredSignInformation = new AllFloorsContentsLabelRequiredSignInformation();
            string strExtractData = (string)value;
            Color clrForeColor = Color.FromName(strExtractData.Substring(0, strExtractData.IndexOf(";") - 1).Trim());
            string strVisible = strExtractData.Substring(strExtractData.IndexOf(";") + 1, strExtractData.Length).Trim();

            allFloorsContentsLabelRequiredSignInformation.ForeColor = clrForeColor;
            if (strVisible == "Yes")
            {
                allFloorsContentsLabelRequiredSignInformation.Visible = ConfirmationAnswers.Yes;
            }
            else
            {
                allFloorsContentsLabelRequiredSignInformation.Visible = ConfirmationAnswers.No;
            }
            return allFloorsContentsLabelRequiredSignInformation;
        }
        return base.ConvertFrom(context, culture, value);
    }
}
4

1 に答える 1

2

プロパティには「Get」しかないため、読み取り専用です。「設定」プロパティを追加してみてください。

[Category("Data")]
[DisplayName("Required Sign")]
[Description("Required Signnnnnnnnnnnnnnn")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public AllFloorsContentsLabelRequiredSignInformation AllFloorsContentsLabelRequiredSignInfo {
  get {
    return allFloorsContentsLabelRequiredSignInformation;
  }
  set {
    allFloorsContentsLabelRequiredSignInformation = value;
  }
}

さらにエラーConvertFromチェックを行う必要があるという問題があります。

于 2012-10-17T13:43:24.993 に答える