私はこのようなクラスを持っています:
_private class MyClass {
[DisplayName("Foo/Bar")]
public string FooBar { get; private set; }
public string Baz { get; private set; }
public bool Enabled;
}
_
_List<MyClass>
_を作成してDataSource
のDataGridView
に割り当てると、グリッドに「Foo/Bar」と「Baz」の2つの列が表示されます。これが私がしたいことです。
Enabledはプロパティではなくフィールドであるため、現在は機能しています。DataGridViewはプロパティのみを取得します。ただし、これは汚いハックです。
Enabledもプロパティにしたいのですが、それでもDataGridViewで非表示にします。
バインド後に手動で列を削除できることはわかっていますが、それは理想的ではありません。
プロパティにタグを付けることができるDisplayNameのような属性はありますか? [Visible(false)]
のようなもの?
[Browsable(false)]
は、プロパティをDataGridView
から非表示にします。
ビジュアルデザイナーは通常、[プロパティ]ウィンドウに、参照可能な属性を持たないメンバー、またはBrowsableAttributeコンストラクターのbrowsableパラメーターをtrueに設定してマークされているメンバーを表示します。これらのメンバーは、設計時に変更できます。 BrowsableAttributeコンストラクターのbrowsableパラメーターをfalseに設定してマークされたメンバーは、デザイン時の編集には適さないため、ビジュアルデザイナーには表示されません。デフォルトはtrueです。
私は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;