- PR -

ボタンのショートカットとValidatingの動作

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-17 19:50
引用:

SADASさんの書き込み (2007-01-17 19:35) より:

Validating で検証中にフォーカス移動するコードがまずいというのは分かりました。


これを受けて、

引用:

という事は、ショートカットでボタン押下した後、テキストボックスの検証でOKだった場合にボタンにフォーカスを移動させたかったのですが、できない(しないほうがよい?)のでしょうか?


"という事は" ~ にはならないと思います。

検証前 (Leave ~ Validating 発生前) および検証後 (Validated) であれば問題ないです。
(まあ、検証前というのはそれ自体が、Validating のもとになっているのであり得ないですが)

よって、"検証で OK だった場合にフォーカスを移動する" というのは、間違った実装にはならないです。

引用:

いまValidatingを使用するとき、ActiveControl でチェックしているのですが、もしよろしければお勧めの方法を教えて頂きたいのですが。


これは、「CauseValidation」 と合わせて、過去ログを検索されると良いでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-01-18 12:04
イベントが発生する順番を見直す

ショートカットだとフォーカスが移動しないことが問題

問題点を誤っているから、解決に時間がかかる

validatingはチェックのみ行う
メッセージはエラープロバイダーにさせる
clickで、activecontrolがボタンじゃないとき、select
_________________
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-01-18 22:00
 昼に送ったことの補足。

 MSDN の Control.Validating イベントの説明は、ちょっとわかりにくいんですよね。
引用:

Control.Validating イベント<microsoft.com> より:
キーボード (Tab、Shift + Tab など) を使用するか、Select メソッドまたは SelectNextControl メソッドを呼び出すか、ContainerControl.ActiveControl プロパティを現在のフォームに設定してフォーカスを変更するとき、次の順序でフォーカス イベントが発生します。

  • Enter
  • GotFocus
    ----- ここまでは、移そうとする前に発生している
  • Leave
  • Validating
  • Validated
  • LostFocus

マウスを使用するか Focus メソッドを呼び出してフォーカスを変更するとき、フォーカス イベントは次の順序で発生します。

  • Enter
  • GotFocus
    ----- ここまでは、移そうとする前に発生している
  • LostFocus
  • Leave
  • Validating
  • Validated



で、移動先のコントロールのイベントは、このさらに後に発生します。

 やってみてわかりましたが、ショートカットキーで Button.Click を駆動させると、フォーカスが TextBox に残ったままですね。これを、ボタンに移動させたい。というのが、本当の問題ですね?

 だったら、button1_Click の方で、ActiveControl を検査しましょう。
コード:
private void button1_Click(object sender, System.EventArgs e)
{
    if (!ActiveControl.Equals(button1))
    {
        button1.Select();
    }
}
private void textBox1_Validating(object sender, CancelEventArgs e)
{
    if(textBox1.Text == "ERR")
    {
        e.Cancel = true;
    }
}
// エラーになる条件だと、[×]で終われないので。
private void form1_Closing(object sender, CancelEventArgs e)
{
    e.Cancel = false;
}



_________________

スキルアップ/キャリアアップ(JOB@IT)