0

コンテナを複雑なオブジェクトの配列にバインドするPropertyGridコントロールがあります。

// Collection
public class ParametersCollection
{
    private ParameterObject [] _parameters = null;

    [Category("SubReportParams")]
    public ParameterObject [] Parameters 
    { 
        get { return _parameters; }
        set { _parameters = value; } 
    }

    public ParametersCollection()
    {
        // _parameters initialization here...
    }
}

// Complex object
public class ParameterObject
{
    private string _name = "";
    private string _value = "";

    [Category("Information"), DisplayName("Name")]
    public string Name 
    { 
       get { return _name; } 
       set { _name = value; } 
    }

    [Category("Information"), DisplayName("Value")]
    public string Value 
    { 
       get { return _value; } 
       set { _value = value; } 
    }
}

2つの場合を除いて、すべてが正常に機能します。

  1. たとえば、array _parametersにアイテムが2つしかない場合、デフォルトの配列サイズは4で、インデックス2と3のアイテムはnullです。PropertyGridは、これらのアイテムを空のフィールドとして表示します。PropertyGridにこれらのフィールドを無視させ、単に表示しないようにするにはどうすればよいですか?

  2. _parameters変数は配列型であるため、_parameters項目は0からnまでのインデックスで表示されます。配列からのインデックスではなく、プロパティParamObject.Nameからの名前でそれらを表示する可能性はありますか?

4

1 に答える 1

1

最初の質問の場合、最も簡単な方法は、「実際の」プロパティから計算された「偽の」プロパティを追加することです。完璧ではありませんが、さまざまな属性を使用して次のことができます。

  • DisplayNameを使用して、偽のプロパティに実際のプロパティの名前を付けます
  • Browsable(false)は、プロパティグリッドに実際のプロパティをスキップするように指示します
  • EditorBrowsable(never)は、このプロパティを外部コードに表示しないようにVisualStudioのインテリセンスに指示します。

        [Browsable(false)]
        public ParameterObject[] Parameters
        {
            get { return _parameters; }
            set { _parameters = value; }
        }
    
        [Category("SubReportParams"), DisplayName("Parameters")]
        [EditorBrowsable(EditorBrowsableState.Never)]
        public ParameterObject[] NonEmptyParameters
        {
            get
            {
                return _parameters.Where(p => p != null).ToArray();
            }
        }
    

2番目の質問の場合、簡単な方法の1つは、次のようなToString()実装を追加することです。

public class ParameterObject
{
    public override string ToString()
    {
        return Name;
    }
}

それ以外の場合は、カスタムTypeConverterをクラスに追加できます。

于 2013-03-21T09:29:29.613 に答える