如果项目出现在另一个列表框中,则从列表框中删除项

时间:2013-12-16 22:19:02

标签: vb.net visual-studio-2012 listbox

我的表单上有2个列表框。第一个从数组填充并显示与Date Time选择器的值相关的文件名。双击该项时,它会移到第二个列表框,从第一个清除,相关文件从一个目录传输到另一个目录。我遇到的问题是,当应用程序关闭然后重新打开时,填充事件的一部分是填充事件的一部分。文件名出现在两个列表框中。

有没有办法说明对象是否出现在1个文本框中,那么它不会出现在另一个文本框中?

我尝试过以下操作,但重新打开仍会在

中显示对象
 Dim item As Object

        For Each item In lstPlanned.Items
            If lstProgress.Contains(item) Then
                lstPlanned.Items.Remove(item)
            End If
        Next

对于第二个列表框,我正在使用以下内容填充它

For Each Dir As String In System.IO.Directory.GetDirectories(aMailbox)
        Dim dirInfo As New System.IO.DirectoryInfo(Dir)
        lstProgress.Items.Add(dirInfo.Name)

满载代码如下

Private Sub Main_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    Dim loaddate As String = Calendar.Value.ToString("dd/MM/yy")

    ReDim AllDetail(0 To 0)
    numfiles = 0


    lstPlanned.Items.Clear()


   Dim allfiles = lynxin.GetFiles("*.txt")
    ReDim AllDetails(allfiles.Count)

    lstProgress.Items.Clear()

    lstPlanned.Items.Add("No Jobs Planned Today!")
    lstPlanned.Enabled = False

    For Each txtfi In (allfiles)
        Dim allLines() As String = File.ReadAllLines(txtfi.FullName)

        AllDetails(numfiles) = New FileDetail()

        AllDetails(numfiles).uPath = Microsoft.VisualBasic.Left((txtfi.FullName), Len(txtfi.FullName) - 4)

        AllDetails(numfiles).uFile = Path.GetFileNameWithoutExtension(txtfi.Name)

        Dim line = allLines.Where(Function(x) (x.StartsWith("unitname="))).SingleOrDefault()
        If line IsNot Nothing Then
            AllDetails(numfiles).uName = line.Split("="c)(1)
        End If

        line = allLines.Where(Function(x) (x.StartsWith("unitcode="))).SingleOrDefault()
        If line IsNot Nothing Then
            AllDetails(numfiles).uCode = line.Split("="c)(1)
        End If

        line = allLines.Where(Function(x) (x.StartsWith("opername="))).SingleOrDefault()
        If line IsNot Nothing Then
            AllDetails(numfiles).uOps = line.Split("="c)(1)
        End If

        line = allLines.Where(Function(x) (x.StartsWith("plandate="))).SingleOrDefault()
        If line IsNot Nothing Then
            AllDetails(numfiles).uPlan = line.Split("="c)(1)
        End If

        line = allLines.Where(Function(x) (x.StartsWith("cliecode="))).SingleOrDefault()
        If line IsNot Nothing Then
            AllDetails(numfiles).uClient = line.Split("="c)(1)
        End If

        If AllDetails(numfiles).uPlan = loaddate Then

            lstPlanned.Items.Remove("No Jobs Planned Today!")
            lstPlanned.Enabled = True
            lstPlanned.Items.Insert(0, AllDetails(numfiles).uName & " - " & AllDetails(numfiles).uCode & " - " & AllDetails(numfiles).uOps)
            numfiles = numfiles + 1

        End If

    Next


    For Each Dir As String In System.IO.Directory.GetDirectories(aMailbox)
        Dim dirInfo As New System.IO.DirectoryInfo(Dir)
        lstProgress.Items.Add(dirInfo.Name)

        Dim item As Object

        For Each item In lstPlanned.Items
            If lstProgress.Contains(item) Then
                lstPlanned.Items.Remove(item)
            End If
        Next
    Next

   End Sub

2 个答案:

答案 0 :(得分:1)

列表框的Contains方法检查控件集合而不是items集合。应该是lstProgress.Items.Contains(item)。您还可以使用DirectoryInfo类的GetDirectories直接获取directoryinfo对象。

在将其添加到lstProgress时检查lstPlanned是否包含每个项目将消除额外的循环,这无论如何都无法正常工作,因为您不允许在For Each循环中修改迭代集合。

我正在查看您的代码并注意到可以进行的改进。使用LINQ扩展方法,每个要添加属性值意味着需要对每个文件行集合进行大量额外迭代。使用选择意味着您只能遍历集合一次。

    For Each txtfi In (allfiles)
        Dim allLines() As String = File.ReadAllLines(txtfi.FullName)

        AllDetails(numfiles) = New FileDetail()

        AllDetails(numfiles).uPath = Microsoft.VisualBasic.Left((txtfi.FullName), Len(txtfi.FullName) - 4)

        AllDetails(numfiles).uFile = Path.GetFileNameWithoutExtension(txtfi.Name)
        AllDetails(numfiles).uPlan = allLines.Where(Function(x) (x.StartsWith("plandate="))).SingleOrDefault().Split("="c)(1)
          If AllDetails(numfiles).uPlan = loaddate Then
            For Each line In allLines
                If line Is Not Nothing Then
                    Dim fields As String() = line.Split("="c)
                    Select Case fields(0)
                        Case "unitname"
                            AllDetails(numfiles).uName = fields(1)
                        Case "unitcode"
                            AllDetails(numfiles).uCode = fields(1)
                        Case "opername"
                            AllDetails(numfiles).uOps = fields(1)
                        Case "plandate"
                            AllDetails(numfiles).uPlan = fields(1)
                        Case "cliecode"
                            AllDetails(numfiles).uClient = fields(1)
                    End Select
                End If
            Next
            lstPlanned.Items.Remove("No Jobs Planned Today!")
            lstPlanned.Enabled = True
            lstPlanned.Items.Insert(0, AllDetails(numfiles).uName & " - " & AllDetails(numfiles).uCode & " - " & AllDetails(numfiles).uOps)
            numfiles = numfiles + 1
        End If
    Next
    Dim RootDir As New System.IO.DirectoryInfo(aMailbox)
    For Each Dir As IO.DirectoryInfo In RootDir.GetDirectories
        Dim item = Dir.Name
        lstProgress.Items.Add(item)
        If lstPlanned.Items.Contains(item) Then
            lstPlanned.Items.Remove(item)
        End If
    Next

答案 1 :(得分:0)

谢谢Tinstaafl

你的回答很有效。

我还修改了你的第一个编辑

Dim RootDir As New System.IO.DirectoryInfo(aMailbox)
    For Each Dir As IO.DirectoryInfo In RootDir.GetDirectories
        lstProgress.Items.Add(Dir.Name)
        'item defaults to object, no need to explicitly declare it
        For Each item In New System.Collections.ArrayList(lstPlanned.Items)
            If lstProgress.Items.Contains(item) Then
                lstPlanned.Items.Remove(item)
            End If
        Next

    Next

修改以下一行

 For Each item In New System.Collections.ArrayList(lstPlanned.Items)

再次感谢