C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: DataGridViewのEnterをFormで捉えるには


(過去ログ 105 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■62949 / inTopicNo.1)  DataGridViewのEnterをFormで捉えるには
  
□投稿者/ latin (1回)-(2011/11/11(Fri) 22:38:13)

分類:[C#] 

WinXP,VisualStudio10 Ultimate(C#)

こんばんは。
いつも参考にさせていただいております。

早速質問ですが、DataGridViewのEnterをFormで捕まえることができるか質問です。

FormのKeyPreviewをTrueにしていますので、コントロールでEnterキーを押した場合は、まずForm側で取得できます。DataGridViewのばあいでも、編集モードではないときは、Form側でEnterキーを捕捉することができますが、編集モードの場合は、どうもうまく捉える事ができません。

DataGridViewから派生したコントロールを使用していますが、編集モードのときは、
ProcessDialogKeyでEnterキーを補足できますが、この場合にForm側にEnterを通知すればいいのかなと思っていますが、そこで止まってしまいました。

EnterキーをForm側でとらえたい理由は、Enterキー内容を確定したとき、Form側で入力内容をチェックしたうえで、右側にカーソルさせたいのです。
このため、DataGridViewのProcessDialogKey内で、ProcessTabKeyをしてカーソル移動をさせるだけでは不十分なためです。
引用返信 編集キー/
■62950 / inTopicNo.2)  Re[1]: DataGridViewのEnterをFormで捉えるには
□投稿者/ ともき (4回)-(2011/11/11(Fri) 23:58:04)
一応、出来ないことはないと思いますが・・・
DataGridView.EditingControlShowing イベントで編集用のコントロール(TextBoxとか)を取得でるので、
このタイミングで、編集用のコントロールのPreviewKeyDownイベントをイベントハンドラに登録すれば、
編集中のEnterキーを捕捉できます、が・・・・これでも、Enterキーを取り消すことはできないでしょう。
ちなみに、編集用コントロールのKeyDownイベントはEnterキーの時は発生しないようですので、
目的のような値の検証→NGの場合はEnterキーを取り消す を行うには、根本的に編集用コントロールの
ウィンドウメッセージをごにょごにょするとかしないとダメじゃないかと思います。

ちなみに DataGridView.CellValidating をお使いになられてはどうでしょうか?
DataGridViewCellValidatingEventArgs.FormattedValue プロパティで編集中の値が取得でき、
DataGridViewCellValidatingEventArgs.Canel プロパティ を使うと確定をキャンセルできます。
引用返信 編集キー/
■62964 / inTopicNo.3)  Re[2]: DataGridViewのEnterをFormで捉えるには
□投稿者/ latin (2回)-(2011/11/14(Mon) 00:55:18)
遅くなってすみません。

ともきさん、ありがとうございます。

DataGridView.CellValidating ですが、ちょっと検討しましたが、ほかのtextBoxとかも、enterキーで捕まえて、チェック後OKだったら、nextコントロールにフォーカスを飛ばす処理をしています。

datagridviewについても、できれば統一した処理を考えており、enterキーを捕まえて、処理をしたいと考えています。
DataGridViewのProcessDialogKeyでenterキーは捕まえられるので、そこで握りつぶすのはできると考えていますが、
まずは、Formに通知しないと始まらないので、そこをどうにかしたいと考えています。

> 編集用のコントロールのPreviewKeyDownイベントをイベントハンドラに登録すれば、
> 編集中のEnterキーを捕捉できます

とありますが、カラムもカスタムコントロールを使用しており、EditingControlも自作しています。
この場合、EditingControl内でPreviewKeyDownのイベントでどのようにすればFormに通知することが
可能になりますか?


引用返信 編集キー/
■62965 / inTopicNo.4)  Re[3]: DataGridViewのEnterをFormで捉えるには
□投稿者/ ともき (5回)-(2011/11/14(Mon) 01:43:04)
通知するだけなら

SendMessage(Form.ActiveForm.Handle, WM_KEYDOWN, New IntPtr(Keys.Enter), 0)

こんな感じでいいのかもしれません。
引用返信 編集キー/
■63012 / inTopicNo.5)  Re[4]: DataGridViewのEnterをFormで捉えるには
□投稿者/ latin (3回)-(2011/11/15(Tue) 21:40:30)
遅くなってすみません。

ともきさん、ありがとうございます。
早速、下記ソースをDataGridView側に追加しましたところ、Form側で、Enterキーを取得することができました。
※ Form側でのActiveControlは、DataGridViewではなく、EditingControlでした。


[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);

protected override bool ProcessDialogKey(Keys keyData)
{
    // 編集中にEnterキーが押された場合も、WindowFormに通知する。
    if ((keyData & Keys.KeyCode) == Keys.Enter)
    {
        SendMessage(this.FindForm().Handle, mMsg.WM_KEYDOWN, (int) keyData, 0);
        // Enterキーを処理したことにする。
        return true;
    }

    return base.ProcessDialogKey(keyData);
}

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -