実行時に PropertyGrid を変更する方法 (プロパティと動的な型/列挙型の追加/削除) 質問する

実行時に PropertyGrid を変更する方法 (プロパティと動的な型/列挙型の追加/削除) 質問する

実行時にプロパティ グリッドをあらゆる方法で変更するにはどうすればよいでしょうか。プロパティを追加および削除し、「動的な型」を追加できるようにしたいと考えています。ここで言う「動的な型」とは、TypeConverter を使用してプロパティ グリッドで実行時に生成されるドロップダウンとなる型のことです。

実際には、これら両方のこと (プロパティの追加/削除と動的タイプの追加) を実行できましたが、同時に実行することはできず、別々に実行できました。

実行時にプロパティを追加および削除するサポートを実装するために、私はこのコードプロジェクトの記事さまざまな型 (文字列だけでなく) をサポートするようにコードを少し変更しました。

private System.Windows.Forms.PropertyGrid propertyGrid1;
private CustomClass myProperties = new CustomClass();

public Form1()
{
    InitializeComponent();

    myProperties.Add(new CustomProperty("Name", "Sven", typeof(string), false, true));
    myProperties.Add(new CustomProperty("MyBool", "True", typeof(bool), false, true));
    myProperties.Add(new CustomProperty("CaptionPosition", "Top", typeof(CaptionPosition), false, true));
    myProperties.Add(new CustomProperty("Custom", "", typeof(StatesList), false, true)); //<-- doesn't work
}

/// <summary>
/// CustomClass (Which is binding to property grid)
/// </summary>
public class CustomClass: CollectionBase,ICustomTypeDescriptor
{
    /// <summary>
    /// Add CustomProperty to Collectionbase List
    /// </summary>
    /// <param name="Value"></param>
    public void Add(CustomProperty Value)
    {
        base.List.Add(Value);
    }

    /// <summary>
    /// Remove item from List
    /// </summary>
    /// <param name="Name"></param>
    public void Remove(string Name)
    {
        foreach(CustomProperty prop in base.List)
        {
            if(prop.Name == Name)
            {
                base.List.Remove(prop);
                return;
            }
        }
    }

等...

public enum CaptionPosition
{
    Top,
    Left
}

私の完全なソリューションはダウンロードできますここ

文字列、ブール値、または列挙型を追加すると正常に動作しますが、StatesList などの「動的タイプ」を追加しようとすると動作しません。理由を知っていて、解決を手伝ってくれる人はいませんか?

public class StatesList : System.ComponentModel.StringConverter
{
    private string[] _States = { "Alabama", "Alaska", "Arizona", "Arkansas" };

    public override System.ComponentModel.TypeConverter.StandardValuesCollection
    GetStandardValues(ITypeDescriptorContext context)
    {
        return new StandardValuesCollection(_States);
    }

    public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
    {
        return true;
    }

    public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
    {
        return true;
    }
}

TypeConverterを使用する方法は、実行時にプロパティを追加しようとしない場合は正常に機能します。たとえば、このコード問題なく動作しますが、両方実行できるようにしたいです。

ぜひご覧ください私のプロジェクト。 ありがとう!

ベストアンサー1

あなたが行うのは、StatesList (TypeConverter) をプロパティとして追加することです。
あなたが行うべきことは、StatesList を TypeConverter として持つプロパティを追加することです。

おすすめ記事