VB.net ListView多次添加项目

时间:2013-02-07 00:01:47

标签: vb.net listview

我遇到的问题是,如果我多次运行我的动作,我会在ListView中为同一项目获取多个条目。

我正在创建一个简单的网络扫描器/主机名抓取器,它会将项目添加到列表视图中,因为它们会在我的ping测试中恢复活动。

当我第一次运行它时,它运行正常,并创建一个应该的条目。

当我随后运行它时,它会像我运行代码ex一样多次创建项目。第三次点击开始它创建每个条目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

以下是我正在使用的后台工作人员的代码:

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
  • 我添加了嘿盒子,果然,ProgressChanged事件被触发了我点击Go按钮的次数。这是我编码错误的原因吗?

1 个答案:

答案 0 :(得分:1)

这很可能是因为您正在添加,但不会删除处理程序以更改进度,因此您需要多次处理该事件。

尝试在实例化后台工作人员时添加Progress Changed事件处理程序,而不是每次单击按钮时添加。这样他们只会处理一次。