tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルMSFlexGridの誤作動?
記事No2089
投稿日: 2005/09/09(Fri) 14:11
投稿者初心者です
[OSのVer]:Windows2000    [VBのVer]:VB.NET win開発 .NET Framework1.1

textboxのエラーチェックをLeaveイベントに記述し、textboxの内容にエラーがある場合はtextboxにフォーカスを戻すという処理をしています。

他のコントロールをクリックしtextboxのLeaveイベントが走る場合は問題ないのですが、MSFlexGridをクリック又はTabキー押下時のフォーカス移動の場合、Leaveイベントが繰り返し走ってしまいます
(LostFocusでも試しましたが結果は同じです)。試しにVB6で同じようなコードで実行したところ問題なく動作しました。

何か回避策がありましたら教えてください。
よろしく御願いします。

ソースコード
Private Sub TextBox1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Leave

         If TextBox1.Text = "" Then
             MsgBox("エラーです")
             TextBox1.Focus()
             Exit Sub
         End If

    End Sub

[ツリー表示へ]
タイトルRe: MSFlexGridの誤作動?
記事No2091
投稿日: 2005/09/09(Fri) 15:13
投稿者花ちゃん
LostFocus のヘルプに下記のように記入しています。

LostFocus イベント ハンドラの中からフォーカスを
設定しないでください。
フォーカスを設定すると、アプリケーションやオペレーティング
システムが応答を停止することがあります。

[ツリー表示へ]
タイトルRe^2: MSFlexGridの誤作動?
記事No2092
投稿日: 2005/09/09(Fri) 16:04
投稿者初心者です
[OSのVer]:Windows    [VBのVer]:VB.NET  
> LostFocus のヘルプに下記のように記入しています。
>
> LostFocus イベント ハンドラの中からフォーカスを
> 設定しないでください。
> フォーカスを設定すると、アプリケーションやオペレーティング
> システムが応答を停止することがあります。

花ちゃんさん、返信ありがとうございます。
ヘルプで確認しておりましたが、.NETのLeaveイベントがVB6でいうLostFocusにあたるということなので、VB6のMSFlexGrid使用が何か関連がないか試しにやってみました。(結果は同じでした・・・)

フォームのActiveControlプロパティを見たところ、TextBox1.Focus()でTextBox1がアクティブになります
が、Leaveイベントを抜けた瞬間、MSFlexGridがアクディブになりTextBoxのLeaveイベントが走るという無限ループになっているようです。

1.TextBox1に入力(TextBox1がアクディブ)

2.MSFlexGridをクリックによりLeaveイベントが走る(MSFlexGridがアクディブ)

3.エラーによりTextBox1にFocus(TextBox1がアクディブ)

4.Leaveイベントを抜ける(なぜかMSFlexGridがアクディブ)

5.またTextBox1のLeaveイベントが走る

あとは4、5の繰り返しです。
走っているイベントが特定できればどうにか回避できると思うのですが、未だ特定するにいたってません。
解決策はあるのでしょうか。

[ツリー表示へ]
タイトルRe^3: MSFlexGridの誤作動?
記事No2093
投稿日: 2005/09/09(Fri) 16:15
投稿者花ちゃん
もう一工夫必要ですが、下記のような感じでフラグを設定するなり
してみてはどうでしょうか?

Private nl As Boolean
Private Sub TextBox1_Leave(ByVal sender As Object, _
                           ByVal e As System.EventArgs) Handles TextBox1.Leave
     If TextBox1.Text = "" Then
        nl = True
        AxMSHFlexGrid1.Enabled = False
        MessageBox.Show("エラーです")
        TextBox1.Focus()
    Else
        nl = False
        AxMSHFlexGrid1.Enabled = True
    End If
End Sub

[ツリー表示へ]
タイトルRe^4: MSFlexGridの誤作動?
記事No2121
投稿日: 2005/09/13(Tue) 10:57
投稿者初心者です
返信遅れてすいません。
花ちゃんさんの例を元に作成したところ、
Leaveイベントが繰り返し走ることはなくなりましたが、
MSFlexGridをどのタイミングでEnable=Trueにするかが問題になり(Leaveイベント終了時にTrueにすると
再度イベントが繰り返し走る為)、解決できなかった為、
別な方法で試みる事にしました。
一次はどうなるかと思いましたが、花ちゃんさんのおかげで解決の糸口をつかめたので感激です。
ほんとうにありがとうございました。

[ツリー表示へ]