0

アクションを複数回実行すると、同じ項目に対して ListView に複数のエントリが表示されるという問題があります。

私は単純なネットワーク スキャナー/ホスト名グラバーを作成しています。これは、アイテムが ping テストで生き返ったときにリストビューに追加します。

初めて実行すると、正常に実行され、必要に応じて1つのエントリが作成されます。

後で実行すると、コードexを実行した回数だけアイテムが作成されます。3 回目のヒット開始では、エントリを 1 回作成するだけで各エントリが 3 回作成されます。

ここに私の行くボタンのコードがあります:

 Private Sub Go_Click(sender As Object, e As EventArgs) Handles Go.Click
        Dim verifyIP
        ListView1.Items.Clear()
        chkDone = 0
        verifyIP = ipChk(ipAdd.Text)
        If verifyIP = 1 Then
            ipAddy = Split(ipAdd.Text, ".")
            pingTest1.WorkerReportsProgress = True
            pingTest1.WorkerSupportsCancellation = False
            AddHandler pingTest1.ProgressChanged, AddressOf pingTest1_ProgressChanged
            pingTest1.RunWorkerAsync()
            pingTest2.WorkerReportsProgress = True
            pingTest2.WorkerSupportsCancellation = False
            AddHandler pingTest2.ProgressChanged, AddressOf pingTest2_ProgressChanged
            pingTest2.RunWorkerAsync()
            pingTest3.WorkerReportsProgress = True
            pingTest3.WorkerSupportsCancellation = False
            AddHandler pingTest3.ProgressChanged, AddressOf pingTest3_ProgressChanged
            pingTest3.RunWorkerAsync()
            pingTest4.WorkerReportsProgress = True
            pingTest4.WorkerSupportsCancellation = False
            AddHandler pingTest4.ProgressChanged, AddressOf pingTest4_ProgressChanged
            pingTest4.RunWorkerAsync()
            While chkDone < 4
                wait(25)
            End While
        Else
            MsgBox("IP Invalid")
        End If
        MsgBox("Done")
    End Sub

これは、私が使用しているバックグラウンド ワーカーの 1 つからのコードです。

Private WithEvents pingTest1 As BackgroundWorker = New BackgroundWorker

    Private Sub pingTest1_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles pingTest1.DoWork
        Try
            Dim hostCheck
            pingResult1 = 0
            pingTestDone1 = 0
            tryIP1 = ipAddy(0) & "." & ipAddy(1) & "." & ipAddy(2) & ".1"
            If My.Computer.Network.Ping(tryIP1) = True Then
                'Dim pingsender As New Net.NetworkInformation.Ping
                'If pingsender.Send(tryIP).Status = Net.NetworkInformation.IPStatus.Success Then
                Try
                    'Dim host As System.Net.IPHostEntry
                    hostCheck = ""
                    'host = System.Net.Dns.GetHostByAddress(tryIP3)
                    'MsgBox(host.HostName)
                    'host3 = host.HostName
                    'hostCheck = System.Net.Dns.GetHostEntry(tryIP3).HostName
                    hostCheck = System.Net.Dns.GetHostByAddress(tryIP1)
                    'get the hostname property 
                    hostCheck = hostCheck.HostName
                    pingTest1.ReportProgress("1", hostCheck)
                Catch f As Exception
                    'MsgBox("Error: " & f.Message)
                    pingTest1.ReportProgress("1", "No Hostname Found")
                End Try
            Else
                pingResult1 = 2
            End If
        Catch d As Exception
            MsgBox("There was an error trying to ping the IP Address: " & d.Message)
        End Try
    End Sub

    Private Sub pingTest1_ProgressChanged(e.ByVal sender As Object, ByVal e As ProgressChangedEventArgs)
        MsgBox("Hey")
        Dim str(2) As String
        Dim itm As ListViewItem
        str(0) = tryIP1 & " Is Alive!!!"
        str(1) = e.UserState
        itm = New ListViewItem(str)
        ListView1.Items.Add(itm)
        str(0) = ""
        str(1) = ""
        itm = Nothing
    End Sub

Private Sub pingTest1_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs) Handles pingTest1.RunWorkerCompleted
    chkDone = chkDone + 1
End Sub
  • Hey ボックスを追加し、Go ボタンを押した回数だけ ProgressChanged イベントがトリガーされることを確認しました。それは私が間違ってコーディングしたものですか?
4

1 に答える 1

1

これは、変更された進行状況のハンドラーを追加しているが削除していないため、イベントを複数回処理している可能性が最も高いです。

ボタンをクリックするたびにではなく、バックグラウンド ワーカーをインスタンス化するときに Progress Changed イベント ハンドラを追加してみてください。この方法では、一度だけ処理されます。

于 2013-02-07T00:17:53.037 に答える