バックグラウンドワーカーからダイアログボックスとして呼び出されるフォームがあります。このダイアログ ボックスには、コンボ ボックスといくつかのボタンがあります。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