2009-07-01 8 views
37

に結合したときに、私はそれのために列を作成していないのDataGridViewを伝えるために私のクラスで使用することができますが属性でありますそれはDataGridViewDataSourceに、グリッドは2つの列、 "Foo/Bar"と "Baz"を表示します。これは私が起こりたいものです。は、私は、このようなクラスを持っているリスト<MyClass>

Enabledはプロパティではなくフィールドであるため、現在は機能しています.DataGridViewはプロパティのみを取得します。しかし、これは汚れたハックです。

私もEnabledプロパティを作成したいと思いますが、それでもDataGridViewで非表示にします。

私は手動でバインドした後に列を削除することができますが、それは理想的ではありません。

DisplayNameに似た属性がありますか?プロパティにタグを付けることはできますか? [Visible(false)]のようなもの?

答えて

67

[Browsable(false)]は、DataGridViewからプロパティを非表示にします。

ビジュアルデザイナは通常、[プロパティ]ウィンドウのいずれかが全く閲覧可能な属性を持っていないか、trueに設定 BrowsableAttributeコンストラクタの閲覧可能なパラメータでマークされたもの メンバーを表示します。 これらのメンバーは、デザイン時に変更できます。 BrowsableAttributeコンストラクターのブラウズ可能なパラメーターをfalseに設定したメンバーは、 で、デザイン時の編集には適していないため、ビジュアルデザイナーに が表示されません。デフォルトはtrueです。

+3

私の目では[Bindable(false)]はうまくいくはずで、Browsable(ヘルプによる)はプロパティがPropertyGridに表示されているかどうかを定義するだけです。ただし、Bindable(false)はDataGridViewによって無視されます。 –

+5

私は同意しますが、Framework Design Guidelines(http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756)を読んで(そして再読した後)、私はデザイナーがいつも自分のルールに従っています(時には意味が分からないこともあります)。 –

+0

これらのコントロールはすべて、 'System.ComponentModel.PropertyDescriptor'を使用するため、メンバの包含/除外に同じロジックを使用します。 'ComponentModel'クラスはカスタマイズ可能ですが、これは大変な作業であるため、これはまれです。 –

9

私はSystem.ComponentModelデコレータはBrowsableAttributeなどの属性と、それは親族PropertyGridへの結合以外のものに関連していただと穏やかに気づいていないしてきました。 (facepalm)私はC-Pound Guruのアプローチが好きです。これは、過去に行ったことよりもあなたのGUIをより疎結合に保つことができるからです。

私は長い間使用してきたアプローチは、DataGridViewの列をプログラマチックにまたはフォームデザイナを使用して事前に定義することです。これを行うと、各列のDataPropertyNameをプロパティの名前に設定できます。唯一のトリックは、DataGridViewのAutoGenerateColumnsプロパティをfalseに設定する必要があることです。そうしないと、DGVは手動で作成された列を完全に無視します。何らかの理由でAutoGenerateColumnsプロパティがフォームデザイナのプロパティグリッドから隠されていることに注意してください。考えません。なぜですか。この手法には、列の書式設定などをあらかじめ設定できる利点があります。バインドする必要はなく、列のレンダリング/サイズ設定を調整する必要はありません。

_DGV.AutoGenerateColumns = false; 
DataGridViewTextBoxColumn textColumn = new DataGridViewTextBoxColumn(); 
textColumn.DataPropertyName = "FooBar"; 
textColumn.HeaderText = "Foo/Bar"; // may not need to do this with your DisplayNameAttribute 
_DGV.Columns.Add(textColumn); 
textColumn = new DataGridViewTextBoxColumn(); 
textColumn.DataPropertyName = "Baz"; 

List<MyClass> data = GetMyData(); 
_DGV.DataSource = data; 
+1

私は、フォームデザイナーを介して 'AutoGenerateColumns'プロパティにアクセスすることを除外された唯一の人ではないことを嬉しく思っています。 –

関連する問題