- PR -

KeyDownとLeaveイベントの併用

1
投稿者投稿内容
どら
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 63
投稿日時: 2006-10-03 20:37
VS2005 win xp windowsフォーム

いつもお世話になっております。

現状、テキストボックスのKeyDownイベントで、次のコントロールに行かせようとしています。
If e.KeyCode = Keys.Enter Then
Me.SelectNextControl(Me.ActiveControl, True, True, True, True)
End If

また、同じテキストボックスのLaeveイベントで、SQLでデータ抽出をおこなっております。

入力されて、enterを押下したら、抽出するという形になっています。
また、マウスでアクティブコントロールを離れた際とかも踏まえて、抽出の処理はLaeveイベントにいれております。

そのときに、もしデータベース抽出で、範囲外(登録外)だった場合には、前のアクティブコントロールに戻す処理をいれているのですが、そうすると、
次のコントロールに進む→"登録されていません"msg→前のコントロールに戻るという形になってしまいます。

見た目がそうなってしまうので、どうにか回避したいのですが・・・

Validatedのイベントでもやってみたのですが、同じ結果でした。

もし、違う方法とかがありましたら、ご教授お願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-10-03 20:45
引用:

どらさんの書き込み (2006-10-03 20:37) より:

また、同じテキストボックスのLaeveイベントで、SQLでデータ抽出をおこなっております。
また、マウスでアクティブコントロールを離れた際とかも踏まえて、抽出の処理はLaeveイベントにいれております。

そのときに、もしデータベース抽出で、範囲外(登録外)だった場合には、前のアクティブコントロールに戻す処理をいれているのですが、そうすると、
次のコントロールに進む→"登録されていません"msg→前のコントロールに戻るという形になってしまいます。

見た目がそうなってしまうので、どうにか回避したいのですが・・・

Validatedのイベントでもやってみたのですが、同じ結果でした。


検証なのですから、Validating イベントで行いましょう。
イベント引数により、フォーカス遷移をキャンセルすることも可能です。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
どら
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 63
投稿日時: 2006-10-03 21:15
じゃんぬねっとさん、返答ありがとうございます。

Validatingイベントとなると引数のsenderとかで、キャンセルする感じなのですかね!?

範囲外だったときに、Validatingイベント引数の CType(sender, *********).Focus()とかだと、キャンセルって意味合いではないですかね・・・

実際、CType(sender, *********).Focus()で試した結果、フォーカスが次にいく→範囲外msg→元にもどるでした。

me.acticcontrol.nameが次のコントロールを示しているのですが、それでも、可能なのでしょうか!?

キャンセルっていう、意味合いが違うのでしょうか!?

非力で申し訳ないのですが、ご教授お願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-10-03 21:35
引用:

どらさんの書き込み (2006-10-03 21:15) より:

Validatingイベントとなると引数のsenderとかで、キャンセルする感じなのですかね!?


sender イベント引数は、イベントの発生元以外の何者でもありません。
sender ではありませんから、これ以降のすべての文章が間違っています。

Cancel したいのに、Cancel 専用のイベント引数を無視してはいけないでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
どら
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 63
投稿日時: 2006-10-03 22:16
じゃんぬねっとさん、返答ありがとうございます。

e.cancel = true ですよね。

それも試していました。でも、できなかったので、違うのかなっと思ってしまいました。

いろいろ検証した結果、データ抽出で、少し時間のロス(ほんとに少しなのですが・・・)があるみたいで、そのせいで、次のコントロールに一瞬フォーカスが移動したようにみえるみたいです。

データ抽出をいったんコメントアウトをしましたら、次のコントロールにフォーカスがあたることは、ありませんでした。

そうなると、違うやりかたで、フォーカスを送らないとだめですよね。

もうちょっと、いろいろ行ってみます。

dothefes
会議室デビュー日: 2006/10/04
投稿数: 1
投稿日時: 2006-10-04 01:04
若干コードが汚くなりますが、以下の方法で解決できのではないでしょうか?

抽出条件となるテキストボックスをtxtHoge、
SQLでのデータ抽出処理をgetFugaメソッド(戻り値に抽出成功/失敗を示すBoolean値を持たせる)としたとき、
Leaveイベント(ValidatingでもOK)内で、

If e.KeyCode = Keys.Enter Then
If getFuga() Then
Me.SelectNextControl(Me.ActiveControl, True, True, True, True)
Else
Me.txtHoge.Focus()
End If
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-10-04 09:14
引用:

dothefesさんの書き込み (2006-10-04 01:04) より:

LeaveイベントValidatingでもOK)内で、
If e.KeyCode = Keys.Enter Then


Leave イベント、Validating イベントに、KeyEventArgs イベント引数はないと思いますが...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
どら
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 63
投稿日時: 2006-10-04 09:56
dothefesさん、じゃんぬねっとさん返答ありがとうございます。

いろいろ試した結果、
txt1 txt2がある状態でtxt1に入力を行い、正常だったらtxt2に、範囲外msgを出す前に、txt1.focusをいれてあげると、次のコントロールでフォーカスが移動した後、元に戻るという現象が直りました。

msgboxを出した後だと、txt2に一瞬移動しちゃうんですかね・・・

もうすこし、検証してみます。
1

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