EditingControlShowing

WindowsFormsのDataGridViewでセルの編集を行うためにインプレイスなエディタコントロールを開く操作を行うと(デフォルトではF2押下やマウスで選択したセルをダブルクリック)、このイベントが発生する。

このイベントは.NET2.0で新たに追加されたイベントだが、名前からしてセルの編集用のコントロールが表示された際に実行したい処理を書くものである。なのでこの時に編集用のコントロールの各種設定を変える為にプロパティを操作したいと思うのが人情だが、MSDNやヘルプには

EditingControlShowing イベントを処理すると、セルが編集モードになったときに、編集コントロールのカスタムの初期化を実行できます。コントロールの表示特性をカスタマイズするには、DataGridViewEditingControlShowingEventArgs.Control プロパティによって返されるコントロールのプロパティを設定するのではなく、DataGridViewEditingControlShowingEventArgs.CellStyle プロパティによって返されるオブジェクトのプロパティを設定します。

とあり、できればCellStyleを使って欲しいという記述がされている。

使ったことがあるプログラマであれば判ると思うが、このCellStyleプロパティで操作できるのはDataGridViewCellStyleクラスで公開されているメンバだけであり、例えば編集用コントロールがTexBoxクラスの派生であった場合に、入力文字の制御や表示に関わる

CharacterCasing
ImeMode
MaxLength

これらのプロパティは無いので操作できない。仮にDataGridViewCellStyleを拡張したとしても拡張したプロパティを編集用コントロールに適切なタイミング(具体的には編集が開始される直前)で反映する手段が無いので、結局は自分でこのイベント内部でコントロールのプロパティを制御する必要が出てくる訳だが、やってみれば判るがカレントセルが使えないケースがあったり、編集用コントロールのVisibleプロパティがfalseに反転していたりと中々上手くいかないケースがある。

.NETのお決まりとして、ソースコードが無いので推測、憶測の域を出ないが、セルの属性を変更する手段として用意されているCellStyleを使わせたいのは、余計なメモリの消費を抑えるのは勿論だが、内部で編集コントロールを生成するタイミングや破棄するタイミングが一様では無い、他のセルで使用された編集用コントロールを流用する可能性がある等、編集コントロールを触らせたくないように見える。しかし、そうなのならば例えば

InitializeEditingControl (OnInitializeEditingControl)
FinalizeEditingControl (OnFinalizeEditingControl)

等というイベント(メソッド)を最初から公開して確実にコントロールのプロパティを初期化するタイミングが欲しい。

むろん、DataGridViewを拡張してこれらのイベントとメソッドを追加するのは難しく無いが、拡張したDataGridViewを配布した瞬間から「GUIコンポーネントの保守」という新たな管理項目(公開されたGUIコンポーネントの保守は一般的なクラスの保守に比べてコストがかかる)が増えるので出来れば避けたいというのが本音だ。