ComboBoxとDataGridViewComboBoxColumnを同期させる(その4)(再)

昨日は中途半端にしか書けなかった。
その前の日のエントリで、カスタムオブジェクトであるGenderItemをComboBoxとDataGridViewComboBoxCellに同期して表示させるために、GetFormattedValueメソッドをオーバライドして対応したが、それではまだ問題があった。具体的には

1.DataGridViewComboBoxCellからの入力に対応できない
ComboBoxの内容を変更することで、DataGridViewComboBoxCellへ変更を反映させるのは問題が無いのだが、その逆にDataGridViewComboBoxCellの内容を変更すると、例外が発生するようになった。そのため、新たにParseFormattedValueメソッドをオーバライドしているが、このメソッドこそがDataGridViewComboBoxCellで変更した内容を元のオブジェクトに復旧させるメソッドである。


2.DisplayMemberとValueMemberプロパティが設定されているとは限らない
この二つのプロパティが設定されている時と、されていない時では振る舞いが変わるのだ。というのも、同プロパティが設定されている場合は、GetFormattedValueメソッドで、ValueMemberからDisplayMember変換が行われ、ParseFormattedValueではその逆にDisplayMemberからValueMemberへの変換が行われる。逆にプロパティがセットされていないケースも考えられるため、その場合はプレーンなオブジェクトを返さなくてはならない。

これらを対策したのが、昨日のソースコードだが、これもあくまで急場の対策の一例であり、フレームワーク側の振る舞いとして汎用的に対応するのは限界がある。やはりDataGridViewのカラム、セルの細かい振る舞いに関してはどうしてもアプリケーション依存にならざるを得ないようだ。

.NET Framework2.0が出てから結構な時間が経った気がするが、DataGridViewとデータバインディングに関しては非常に参考資料が少ない。WindowsFormsだから(ASP.NETじゃないから)という理由もあるだろうが、参考した情報の殆どは海外のサイトや文書だった。(DataGridViewを紹介しているサイトはたくさんあるのだが、DataGridViewのデータバインドの細かい話にまで言及しているサイトは殆ど無かった)

参考にしたサイトと文書

DataGridView FAQ - jfo's coding (Word文書)

Windows Forms .NET The Official Microsoft Windows Forms Community Site

Google Groups search "DataGridView"

DataGridView コントロール (Windows フォーム)