web-dev-qa-db-ja.com

List <MyClass>にバインドされたときに、DataGridViewに列を作成しないように指示するためにクラスで使用できる属性はありますか?

私はこのようなクラスを持っています:

_private class MyClass {
  [DisplayName("Foo/Bar")]
  public string FooBar { get; private set; }
  public string Baz { get; private set; }      
  public bool Enabled;
}
_

_List<MyClass>_を作成してDataSourceDataGridViewに割り当てると、グリッドに「Foo/Bar」と「Baz」の2つの列が表示されます。これが私がしたいことです。

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

Enabledもプロパティにしたいのですが、それでもDataGridViewで非表示にします。

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

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

42

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

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

72
C-Pound Guru

私はBrowsableAttributeのようなSystem.ComponentModelデコレータ属性とその親族がPropertyGridへのバインディング以外のものに関連していることを気づいていませんでした。 (facepalm)C-Pound Guruのアプローチが気に入っています。これにより、GUIを以前よりも疎結合に保つことができます。

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

これが私が意味することの例です:

_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;
10
Yoopergeek