【C#,WPF】DataGrid選択行から非表示カラムの値を取得

【C#,WPF】DataGrid選択行から非表示カラムの値を取得

WPFでデータグリッドの選択行にあるセル値を取得する際、DataGridColumnのGetCellContentを利用する方法があります。ただし、この方法は取得したいセルが画面に表示されていない場合、値の取得に失敗してしまいます。そこで、カラムが非表示でもセルの値を取得する方法を紹介します。

前提

取得例に使用するデータグリッドには「dgMaster」という名前を設定しています。
dgMasterには「no, name, secret」という順序で、3つのカラムを定義しています。
カラムの種別は3つとも「DataGridTextColumn」で、セルにはテキストが表示されます。
secretカラムのVisibilityはHiddenまたはCollapsedになっていて、画面に表示されない状態です。
noカラムとnameカラムは、画面に表示されている状態です。

GetCellContentを使った場合

対象カラムのGetCellContentを呼び、引数にデータグリッドの選択行(SelectedItem)を渡します。
セルがテキストの場合は戻り値がTextBlockになり、Textプロパティからセル値が取得できます。
以下が、サンプルコードです。

サンプルコード(GetCellContent)

// noカラムの値を取得
DataGridColumn noColumn = this.dgMaster.Columns[0];
TextBlock noCellText = (TextBlock)noColumn.GetCellContent(this.dgMaster.SelectedItem);

// nameカラムの値を取得
DataGridColumn nameColumn = this.dgMaster.Columns[1];
TextBlock nameCellText = (TextBlock)nameColumn.GetCellContent(this.dgMaster.SelectedItem);

// secretカラムの値を取得
DataGridColumn secretColumn = this.dgMaster.Columns[2];
TextBlock secretCellText = (TextBlock)secretColumn.GetCellContent(this.dgMaster.SelectedItem);

// ※
// stringで取得したい場合は、TextBlockのTextプロパティを参照
// それぞれ「noCellText.Text, nameCellText.Text, secretCellText.Text」
// ※

この方法ですと、no列とname列の値は取得できますが、secret列の値は取得できません。
カラムのVisibilityがHiddenまたはCollapsedになっているとき、GetCellContentの戻り値にはnullが返ってきてしまいます。
(サンプル11行目のsecretCellTextはnullになり、secretCellText.Textの参照で例外が発生。)

非表示カラムの値を取得する方法

データグリッドのSelectedItemを直接展開する形で、セルの値を取得することができます。
この場合、データグリッドにバインドしているデータの型に合わせ、適切なキャストをする必要があります。
以下が、サンプルコードです。

サンプルコード(非表示カラムの値を取得)

// DataGridにDataTableをバインド時は、 SelectedItemをDataRowViewでキャスト
string secretCellText1 = ((DataRowView)this.dgMaster.SelectedItem).Row.ItemArray[2].ToString();

// DataGridにstring[][]をバインド時は、 SelectedItemをstring[]でキャスト
string secretCellText2 = ((string[])this.dgMaster.SelectedItem)[2];

サンプルのコメントにも書いていますが、データグリッドにバインドしたデータにより取得方法が変わります。
例として、データテーブル(DataTable)をバインドしたときと、文字列配列(string[][])をバインドしたときの方法を記載しています。
それぞれのデータに対応した型でキャストすることで、非表示にしているsecret列のセル値も取得できるようになります。

まとめ

カラムがHiddenやCollapsedで非表示になっているとき、セルの値を取得する方法を解説しました。
テーブルに見えない隠しカラムを用意し、内部処理でのみ使いたいときなどにご活用ください。
ただし注意点として、データグリッドにバインドしたデータの型によって、値の取得方法を変えないといけないのが難点です。


スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください