- PR -

何度もイベントが発生するのは・・

投稿者投稿内容
りんご
ベテラン
会議室デビュー日: 2006/12/21
投稿数: 51
投稿日時: 2006-12-28 13:39
いつもお世話になっております。

開発環境 VB2005.NET DB=FireBird WindowsXP
不思議な現象が起きていて、大変困っています。

とあるボタンの処理で、ボタンがクリックされたときも
Escキーが押されたときも同じ処理を行うようにしているのですが、
そのボタンを終了したあとに、次のテキストへフォーカスを設定
していますが、Escキーの場合はそのまま処理続行します。
が、クリックでそこを通ったときには、前フォーカスのあった
コントロールのLeaveイベントが永遠に走るのです。(画面真っ白)

仕様ではEscキーの処理の方が正しいのですが、
クリックイベントでボタンが押されたときも
同じような動作をしないといけません。

いろいろ検索したのですが、全く解決口が見つかりません。
ボタンが終了したら、保存しておいたコントロールへフォーカスを
戻さないといけないのですが、
その一つ前のコントロールのLeaveイベントが発生しないようにするには
どうしたらいいのでしょうか?

もしくはe.Handled = TRUEというような
処理が終了したことをNETに知らせる方法が
CloseButton_Clickでできるのでしょうか?
CloseButtonのe(EventArgs)にはHandledはないので、
他に方法があればどなたかご教授ください。

よろしくお願いいたします。

'Escが押されたら閉じるところへ
Private Sub SearchText_KeyDown( _
ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) Handles SearchText.KeyDown, SelectionCombo.KeyDown, DataGrd.KeyDown, SelectButton.KeyDown, ExecButton.KeyDown

Select Case e.KeyCode
Case Keys.Enter
Me.SelectNextControl(sender, True, True, True, False)
e.Handled = True
Case Keys.Escape
CloseButton.PerformClick()
e.Handled = True
End Select

End Sub

’ボタン終了後
WofkControl.Focus() ’保存しておいたコントロールへフォーカス移動
TextBox.Visible = False  ’←この後、マウスクリックだと、永遠にTextBoxのLeaveが走る。なぜかEscキーだとLeaveは発生しない
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-28 14:43
引用:

りんごさんの書き込み (2006-12-28 13:39) より:

とあるボタンの処理で、ボタンがクリックされたときもEscキーが押されたときも同じ処理を行うようにしているのですが、そのボタンを終了したあとに、次のテキストへフォーカスを設定していますが、Escキーの場合はそのまま処理続行します。
が、クリックでそこを通ったときには、前フォーカスのあったコントロールのLeaveイベントが永遠に走るのです。(画面真っ白)


"そのボタンを終了したあと" とは何ですか? (コードのコメントにもありますが)

引用:

仕様ではEscキーの処理の方が正しいのですが、クリックイベントでボタンが押されたときも同じような動作をしないといけません。


[Esc] キーの機能は、通常 Form の CancelButton に割り当てます。
キーイベントで、PerfomeClick メソッドを呼び出したりしない方が良いです。

引用:

ボタンが終了したら、保存しておいたコントロールへフォーカスを戻さないといけないのですが、その一つ前のコントロールのLeaveイベントが発生しないようにするにはどうしたらいいのでしょうか?


その Leave イベントには何も処理が入っていないのでしょうか。
イベントが発生することを知っているということは、イベント プロシージャがあるということだと思いますが。

コードを提示するならば、再現する最小限のコード (ミニマム コード) でお願いします。
それをしないまま質問しているとすると、原因の絞り込みもせずに投稿していることになります。

# 最小限のコードさえわかれば、自分で解決できたりもします。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
りんご
ベテラン
会議室デビュー日: 2006/12/21
投稿数: 51
投稿日時: 2006-12-28 15:13
じゃんぬねっと様、いつもありがとうございます。
納期が本日午前中なのに、バグがとれなくて泣いてます(TT)

ボタンというのは、フォーム上の閉じるボタンではないので
CancelButtonはないです。
自作コントロール内部の閉じるボタンです。

動作
@フォームからコントロール表示
AコントロールのどこでもEscキーを押す
Bコントロールの表示を消す
Cフォームの元々のカーソルのあったコントロールにフォーカス

↑このAのEscキー動作をコントロール内の「閉じる」ボタンをマウスクリック
すると、フォーム側のコントロールのLeaveイベントが無限に走ります。。
なぜかEscキーでは走らないのです(??)

それと、Leaveイベント内は何もやっていません。
画面が空白なので、いろいろイベントを追加してみて(中身なし)
ブレークポイントをおいてみると、何度もLeaveが走っているのを発見。

**フォーム側
Private Sub SearchBox2_SearchEnd(ByVal sender As Object, ByVal e As System.EventArgs, _
ByVal sel As String, ByVal ke As System.Windows.Forms.KeyEventArgs) _
Handles SearchBox2.SearchEnd
Dim mmCODE As Integer
Dim retValue As Boolean
Dim vv As Control

vv = GetNextControl(CC, True)
Debug.Print(vv.Name)
mmCODE = SearchBox2.wCODE
'12/28 del
'SearchBox2.Visible = False

'選択されたか?
If sel = "SEL" Then
If TypeName(CC) = "TextBox" Then
CC.Text = mmCODE
End If
'↓以下ではTabオーダーがきくので違うコントロールへフォーカスが移ってしまう
'Me.SelectNextControl(Me.ActiveControl, True, True, True, True)
Me.SelectNextControl(CC, True, True, True, True)
Else '"NON"の場合
'終了処理がいる→KeyEventArgsを引数に追加・・ムリぽ
ke.Handled = True
'If ke.KeyCode = Keys.Escape Then
' Me.ActiveControl = Me.TextBox1
'Else
retValue = CC.Focus()
'End If
'SearchBox2.Visible = False
End If
SearchBox2.Visible = False

End Sub

**自作コントロール側 ESCキー押下時
Private Sub SearchText_KeyDown( _
ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) _
Handles SearchText.KeyDown, SelectionCombo.KeyDown, DataGrd.KeyDown, SelectButton.KeyDown, ExecButton.KeyDown
Select Case e.KeyCode
Case Keys.Enter
Me.SelectNextControl(sender, True, True, True, False)
e.Handled = True
Case Keys.Escape
'CloseButton.PerformClick()
EndEnd(sender, e)
e.Handled = True
End Select

End Sub
**自作コントロール「閉じる」クリック時
'閉じるボタン押下でコントロール終了
Private Sub CloseButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CloseButton.Click, CloseButton.Enter

'バグのため変更
Dim eg As System.Windows.Forms.KeyEventArgs = New Windows.Forms.KeyEventArgs(Keys.Escape)
SearchText_KeyDown(sender, eg)
End Sub

***自作コントロール終了処理内部
Private Sub EndEnd(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)

Debug.Print("終了処理です")
'接続していたら、閉じる
If Me.OdbcConnection1.State = ConnectionState.Open Then
Me.OdbcConnection1.Close()
End If
'返す値は0
wCODE = 0
'コントロール終了のため、データ・表示をクリアしておく
DataGrd.DataSource = Nothing
DataGrd.ClearSelection()
DataGrd.Columns.Clear()
SearchText.Text = ""
CountLabel.Text = 0
Dim eg As System.Windows.Forms.KeyEventArgs = New Windows.Forms.KeyEventArgs(Keys.Escape)
RaiseEvent SearchEnd(sender, New System.EventArgs(), "NON", eg)

End Sub

フォームのvisibleの位置を変えましたが結果は同じでした・・
また、Validatingなどで別のコントロールにFocus()しても
Leaveが走ります。
あと、自作コントロールの終了でクリック時にわざわざキーダウン(Esc)させて
いるのは、e.Handledに来させればうまくいくかと思ったのですが、
結果は同じでした・・・

いつもすみません。
新規.NET開発で誰も頼る人もいないです・・・
何かヒントでもいいので、どうぞよろしくお願いいたします。
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-12-28 16:02
あせっているのは分からなくもないですが、じゃんぬねっと氏は「最小限のコードで提示をお願いします」とおっしゃっていることに気付いていますか?

せめて、BB コードを使って下さい。

あなたが回答者だとして、あなたの提示したコードを見て、どう思いますか?
mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2006-12-28 16:02
msoです。

よくわからないのですが、どこでループしているのでしょうか?
EndEndのメソッドでしょうか?
りんご
ベテラン
会議室デビュー日: 2006/12/21
投稿数: 51
投稿日時: 2006-12-28 16:13
ご返答ありがとうございます。

>ひろれいさん
すみません。
BBコードを知りませんでした。
勉強します。

>msoさん
ループしているのは、自作コントロールで「閉じる」
クリックした後に、フォームに戻ってきて、
SearchBox2_SearchEndを終了したあとに、
SearchBox2_Leaveが何度もループしています。

「Esc」押下ではLeaveにはいかず、画面に戻ります。



じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-28 16:18
引用:

りんごさんの書き込み (2006-12-28 15:13) より:

ボタンというのは、フォーム上の閉じるボタンではないのでCancelButtonはないです。
自作コントロール内部の閉じるボタンです。


あ、以前のスレッドで質問された UserControl のことですね。

引用:

Dim eg As System.Windows.Forms.KeyEventArgs = New Windows.Forms.KeyEventArgs(Keys.Escape)
SearchText_KeyDown(sender, eg)


こういうイベント プロシージャの使い方はやめましょう。
イベントは内部の実装によって勝手に起きるもので、表面もしくは外部から起こすものではありません。

ところで、SearchEnd イベントは複数回起きたりしていませんか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2006-12-28 16:40
msoです。

SearchText_KeyDown

EndEnd

SearchEnd


で無限ループしてませんか?

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