PropertyGridでプログラムでフィールドを非表示
-
06-07-2019 - |
質問
使用
<System.ComponentModel.TypeConverter(GetType(System.ComponentModel.ExpandableObjectConverter))> _
いくつかのプロパティで構成されるクラス(別のクラスのプロパティ)の宣言。
単に...でこのクラスのインスタンスをロードします
PropertyGrid1.SelectedObject = oColumn
明らかに、コードでpropertygridを手動でビルドしたくありません。その方法は知っています。
しかし、ここに問題があります。プロパティの値によっては、他の特定のプロパティが表示されないようにする必要があります。これは、
<System.ComponentModel.Browsable(False)> _
プロパティ宣言の属性。
プロパティグリッドのすべての構築を手動で処理することなく、プログラムでこれを実行する方法はありますか
解決
gridItem.Hide()を期待していた場合、答えはノーです。 MS PropertyGridでそれを実現する唯一の方法は、TypeConverterまたはカスタムタイプ記述子(ICustomTypeDescriptorを実装する)のGetPropertiesメソッドを介してプロパティを動的に公開することです。最初にTypeConverterで試します(特に、チェックするプロパティ値が同じレベルにある場合)。実行するコーディングは少なくなります。
他のヒント
実際、これは完全に可能です。最初の最も簡単な方法は、グリッドのBrowsableAttributesプロパティを設定することです:
propGraph.BrowsableAttributes = new AttributeCollection(
new Attribute[]
{
new CategoryAttribute("Appearance")
});
これにより、指定した属性タイプと一致しないすべてのプロパティが除外されます。残念ながら、これは負のフィルターではなく正のフィルターであり、IMHOの有用性が低くなります。
2番目に、同様に簡単に、PropertyGridに表示するオブジェクトの周りに単純なラッパーを作成し、非表示にするなどのプロパティを再定義できます。パススループロパティとして:
public class MyDerivedControl : public TextBox
{
[Browsable(false)]
[Category("MyCustomCategory")]
public new bool Enabled
{
get { return base.Enabled }
set { base.Enabled = value; }
}
}
プロパティグリッドにポップすると、Enabledプロパティが非表示になります。
第3に、PropertyGrid自体をカスタマイズして、タイプ記述子などの世界に入ることができますが、2つのプロパティを非表示にするだけなら、これはやり過ぎです。
これがお役に立てば幸いです。
C ++に関しては、選択したカテゴリを propertyGrid
に表示する簡単なソリューションがあります。
cli::array<Attribute^,1>^ attrs = {gcnew CategoryAttribute("Appearance")};
this->PropertyGrid->BrowsableAttributes = gcnew AttributeCollection(attrs);
this->PropertyGrid->SelectedObject = this->SelectedControl;
これにより、propertyGridには「外観」カテゴリのみが表示され、他のすべてのカテゴリは非表示になります。 自分でC#のコードを翻訳できると仮定します。
この質問は似ていますが、答えはより完全な。一部の人々は相互参照を希望する場合があります。