DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataGridView列カスタムのOnLeaveでText変更

環境/言語:[WindowsXP C#3.5]
分類:[.NET]

C#3.5でWindowsアプリを作成しています。

DataGridViewで入力可能なコンボボックス列を作成しよう
としています。その機能の一つとして入力後の値を整形しよう
としているのですが、整形後の値になってくれません。

DataGridViewComboBoxEditingControlのカスタムクラスで
OnLeaveをオーバーライドして値を整形しています。

テスト用に以下のように強制的にテキストを変更していますが…
マウスクリックによりフォーカスを移すと正常に整形されます、
TABキーによりフォーカスを移すと整形前の値になります。

protected override void OnLeave(EventArgs pe)
{
     this.Text = "aaa";
     base.OnLeave(pe);
}

TABキーによる移動だとなぜダメなのかわかりません。

IsInputKeyイベントでTAB判定して行えば可能なのかもしれません
がOnLeaveでできるなら そのほうが良いかと思いまして質問しました。

対策をご教授いただけると助かります。
よろしくお願いします。
2012/03/24(Sat) 20:28:06 編集(投稿者)

タブキーのフォーカス移動では、Leaveイベントは発生していますか?
まずは、タブキーではLeaveイベントが発生しないのか、Leaveイベントは発生するけれど表示が元に戻ってしまうのかを確認する必要があります。

あと、Leaveイベントの代わりにValidatingイベントなどを使うとどうでしょうか。
■No30141に返信(ズッカさんの記事)

返信ありがとうございます。

> タブキーのフォーカス移動では、Leaveイベントは発生していますか?

発生しています。
デバッグで、Leaveイベント内ではTextの値は変更されていますが
表示が元に戻ってしまいます。

> あと、Leaveイベントの代わりにValidatingイベントなどを使うと
> どうでしょうか。

ValidatingおよびValidatedの場合でも同様の事象になります。
よろしくお願いいたします。
OnLeaveイベントが発生した後に、
別のタイミングで上書きされるということは考えられないでしょうか?
検証用の小さなアプリを作成し、検証されることをお勧めします。
それでも原因がわからないようであるならば、
コントロールの仕様なのかもしれません。
■No30151に返信(kikuさんの記事)
> OnLeaveイベントが発生した後に、
> 別のタイミングで上書きされるということは考えられないでしょうか?

返信ありがとうございます。
最小のソースで再度確認したところ、原因がわかりました。
イベントの発生順番の問題でした。

コンボボックスを入力可能にするためにDataGridView_CellValidating
イベントにて、入力値がコンボのリストになければItems.Addする
としています。

            if (this.Columns[e.ColumnIndex] is TestColumn)
            {
                TestColumn cbc = (TestColumn)this.Columns[e.ColumnIndex];
                if (cbc.Items.Contains(e.FormattedValue) == false)
                {
                    //コンボになければ設定する
                    cbc.Items.Add(e.FormattedValue);
                }
                //セルの値を設定
                this[e.ColumnIndex, e.RowIndex].Value = e.FormattedValue;
            }
        }

マウスクリックの場合、以下のようにイベントが発生します、、、
DataGridViewComboBoxEditingControl_OnLeave
↓
DataGridView_CellValidating
↓
DataGridViewComboBoxEditingControl_OnLeave

TABキーの場合、以下のようにイベントが発生します、、、
DataGridView_CellValidating
↓
DataGridViewComboBoxEditingControl_OnLeave

原因がわかりましたので対策を考えてみます。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板