27

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

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

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

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

私のプロジェクトを見てください。ありがとう!

4

4 に答える 4

8

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

于 2008-11-24T10:52:05.587 に答える
6

あ、もちろん!

myProperties.Add(new CustomProperty("Custom", "", typeof(States), false, true));

[TypeConverter(typeof(StatesList))]
public class States
{
}

魅力のように動作します、ありがとう!

私は自分のプロジェクトを更新しました。他の人に役立つことを願っています。ここで見つけることができます。

于 2008-11-24T12:26:49.983 に答える
5

この質問と回答は私にとって非常に役に立ちました。ただし、実行時に生成されるドロップダウンリスト値を許可することで、さらに拡張する必要がありました。誰かがそれが役に立つと思う場合に備えて、私はそれが必要とするものに関していくつかのサンプルコードを投稿すると思いました。

まず、CustomPropertyコンストラクターにoptionsパラメーターを追加し、Optionsプロパティを追加しました。

    private List<string> lOptions;

    public CustomProperty(string sName, object value, Type tType, bool bReadOnly, bool bVisible, List<string> lOptions)
    {
        this.lOptions = lOptions;
    }

    public List<string> Options
    {
        get { return lOptions; }
    }

次に、OptionsプロパティをCustomPropertyDescriptorクラスに追加しました。

    public List<string> Options
    {
        get
        {
            return m_Property.Options;
        }
    }

3番目に、CustomPropertyDescriptorオブジェクトの新しいOptionsプロパティを利用するために、動的型クラス(つまり、StatesList)のGetStandardValuesメソッドを変更する必要がありました。

    public override StandardValuesCollection
                 GetStandardValues(ITypeDescriptorContext context)
    {
        CustomPropertyDescriptor descriptor = (CustomPropertyDescriptor)context.PropertyDescriptor;
        return new StandardValuesCollection(descriptor.Options);
    }

最後に、新しいCustomPropertyオブジェクトを作成するときに、オプションのリストを渡す必要がありました。

    List<string> optionsList = new List<string>(new string[] { "test1", "test2", "test3" });        
    CustomProperty myProperty = new CustomProperty(attr.Name, attr.Value, valueType, false, true, optionsList);

この例で渡した静的リストの代わりに、ドロップダウンのオプションのリストを任意の方法で生成して、使用可能なオプションを完全に制御できます。

于 2011-08-03T13:03:07.383 に答える
0

私の場合、TypeConverter は States クラスには適用されませんでした

[TypeConverter(typeof(StatesList))] // not work
public class States
{
}

だから私は CustomPropertyDescriptor にオーバーライドを追加しました

public override TypeConverter Converter
{
    get {
        if (this.PropertyType.Equals(typeof(States)) ) {
            return new StatesList(); ; 
        }
        return base.Converter;
    }
}
于 2017-04-26T07:44:45.467 に答える