- - PR -
何度もイベントが発生するのは・・
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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は発生しない | ||||||||||||
|
投稿日時: 2006-12-28 14:43
"そのボタンを終了したあと" とは何ですか? (コードのコメントにもありますが)
[Esc] キーの機能は、通常 Form の CancelButton に割り当てます。 キーイベントで、PerfomeClick メソッドを呼び出したりしない方が良いです。
その Leave イベントには何も処理が入っていないのでしょうか。 イベントが発生することを知っているということは、イベント プロシージャがあるということだと思いますが。 コードを提示するならば、再現する最小限のコード (ミニマム コード) でお願いします。 それをしないまま質問しているとすると、原因の絞り込みもせずに投稿していることになります。 # 最小限のコードさえわかれば、自分で解決できたりもします。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 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-12-28 16:02
あせっているのは分からなくもないですが、じゃんぬねっと氏は「最小限のコードで提示をお願いします」とおっしゃっていることに気付いていますか?
せめて、BB コードを使って下さい。 あなたが回答者だとして、あなたの提示したコードを見て、どう思いますか? | ||||||||||||
|
投稿日時: 2006-12-28 16:02
msoです。
よくわからないのですが、どこでループしているのでしょうか? EndEndのメソッドでしょうか? | ||||||||||||
|
投稿日時: 2006-12-28 16:13
ご返答ありがとうございます。
>ひろれいさん すみません。 BBコードを知りませんでした。 勉強します。 >msoさん ループしているのは、自作コントロールで「閉じる」 クリックした後に、フォームに戻ってきて、 SearchBox2_SearchEndを終了したあとに、 SearchBox2_Leaveが何度もループしています。 「Esc」押下ではLeaveにはいかず、画面に戻ります。 | ||||||||||||
|
投稿日時: 2006-12-28 16:18
あ、以前のスレッドで質問された UserControl のことですね。
こういうイベント プロシージャの使い方はやめましょう。 イベントは内部の実装によって勝手に起きるもので、表面もしくは外部から起こすものではありません。 ところで、SearchEnd イベントは複数回起きたりしていませんか? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2006-12-28 16:40
msoです。
SearchText_KeyDown ↓ EndEnd ↓ SearchEnd ↓ ? で無限ループしてませんか? |