0

バックグラウンドワーカーからダイアログボックスとして呼び出されるフォームがあります。このダイアログ ボックスには、コンボ ボックスといくつかのボタンがあります。selectedindexchangedコンボ ボックスに基づいたハンドルを持つサブがあります。

このサブの条件の 1 つの中で、コンボ ボックスの選択されたインデックスが変更されます。がselectedindex変更されると、デバッガーは現在の行で停止し、selectedindexchangedサブルーチンをもう一度呼び出すように見えます。サブルーチンをエラーなしで最後まで実行し、インデックスが変更された行の後に再開します。ただし、サブルーチンの最初のインスタンスが終了すると、backgroundworker からダイアログ ボックスを呼び出す行によってエラーがスローされます。Exception has been thrown by the target of an invocation.

したがって、ここには基本的に 2 つの問題があり、1 つのソリューションで解決できます。まず、selecetedindexchangedサブが 2 回実行されないようにする方法と、サブが終了したときにエラーが発生する方法です。

以下サンプルコード。

ダイアログ ボックスを呼び出すコード:

 If diaImpSelectedSite.IsAccessible = False Then diaImpSelectedSite.Activate()
                    diaImpSelectedSite.RequestSender = Me
                    diaImpSelectedSite.ShowDialog()
                    DialogResult = diaImpSelectedSite.Result()
                    diaImpSelectedSite.Close()

コードSelectedIndexChanged

 Private Sub cmbSites_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbSites.SelectedIndexChanged
    If Not cmbSites.SelectedIndex = -1 Then
        If cmbSites.SelectedIndex = cmbSites.Items.Count - 1 Then
            MsgBox(Str(cmbSites.SelectedIndex) & "/" & Str(cmbSites.Items.Count))
            Dim result As String = funAddSite()
            FillSites()
            cmbSites.SelectedIndex = SiteFromSiteName(result) - 1
            Exit Sub
        Else
            bttYes.Enabled = True
        End If
    End If
End Sub

上記のサブの関数のコード

Private Function funAddSite()
    Dim showndiaAddsite As diaAddSite = New diaAddSite()
    showndiaAddsite.RequestSender = Me
    showndiaAddsite.ShowDialog()
    Return showndiaAddsite.Result()
    showndiaAddsite.Close()
End Function

Fillsites Private Sub FillSites()のコード

    Dim RecordCounter As Integer
    Dim sitetags As New List(Of Integer)
    cmbSites.Items.Clear()

    If Not UserSites(0) Is Nothing Then
        For RecordCounter = 1 To Sites.Rows - 1 Step 1
            If Not Sites.Value(0, RecordCounter) = Nothing Then
                sitetags.Add(RecordCounter)
                cmbSites.Items.Insert(cmbSites.Items.Count, "TTSite_" & Format(RecordCounter, "000") & " " & Sites.Value(0, RecordCounter))
            End If
        Next
    End If
    cmbSites.Items.Insert(cmbSites.Items.Count, "New Site...")
    cmbSites.Text = "Select Site..."
End Sub
4

1 に答える 1

0

イベント ハンドラーが 2 回実行されるのを防ぐ方法はいくつかありますが、そのうちの 2 つは次のとおりです。

簡単
イベント ハンドラーが現在実行中かどうかを示すメンバー変数を設定し、フラグが設定されていない場合にのみイベント ハンドラーを実行することができます。

Private Sub cmbSites_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbSites.SelectedIndexChanged
    If Not m_alreadyInSelectedIndexChanged And Not cmbSites.SelectedIndex = -1 Then
        m_alreadyInSelectedIndexChanged = True
        Try
            If cmbSites.SelectedIndex = cmbSites.Items.Count - 1 Then
                MsgBox(Str(cmbSites.SelectedIndex) & "/" & Str(cmbSites.Items.Count))
                Dim result As String = funAddSite()
                FillSites()
                cmbSites.SelectedIndex = SiteFromSiteName(result) - 1
                Exit Sub
            Else
                bttYes.Enabled = True
            End If
        Finally
            m_alreadInSelectedIndexChanged = False
        End Try
    End If
 End

詳細
イベント ハンドラーに入るときにイベント のイベント ハンドラーを削除し、イベント ハンドラーをcmbSites.SelectedIndexChanged終了する前に再度追加します。

于 2013-01-08T11:17:53.860 に答える