2013-12-16 5 views
1

У меня есть 2 listbox в моей форме. Первый заполняется из массива и отображает имена файлов, которые относятся к значению выбора времени. Когда этот элемент дважды щелкнут, он переместится во второй список, очистится от 1-го, и соответствующие файлы будут перенесены из одного каталога в другой. Проблема заключается в том, что, поскольку население является частью события загрузки после закрытия приложения, а затем снова открывается имена файлов в обоих списках.Удалить элементы из списка, если они есть в другом

Есть ли способ сказать, если объект появляется в 1 текстовом поле, то он не должен появляться в другом?

Я попытался следующие, но повторное открытие еще отображает объект в обоих

Dim item As Object 

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

Для 2 ListBox Я использую следующие для заполнения его

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 

ответ

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) 

Еще раз спасибо

+0

Добро пожаловать. См. Мое последнее изменение. Я удалил лишний для каждого цикла. – tinstaafl

+0

@tinstaafl Придумайте немного проблемы. Если в списке есть 2 элемента, когда я теперь дважды щелкаю его, удаляются оба, а не только выбранные? – elmonko

+0

Попробуйте использовать RemoveAt (selectedindex) или что-то подобное, которое выглядит только по конкретному индексу, а не по самому элементу. – tinstaafl

1

Метод Содержит списка проверок коллекций элементов управления, а не элементов коллекционирования п. Это должно было быть lstProgress.Items.Contains(item). Также вы можете использовать GetDirectories класса DirectoryInfo для непосредственного получения объектов directoryinfo.

Проверка, чтобы убедиться, что lstPlanned содержит каждый элемент, когда вы добавляете его в lstProgress, устранит дополнительный цикл, который не будет работать в любом случае, поскольку вам не разрешено изменять итерированную коллекцию в цикле For Each.

Я искал ваш код и заметил улучшение, которое можно было бы сделать. Использование методов расширения LINQ, каждый из которых вы хотите добавить значение свойства, означает много дополнительных повторений через каждую коллекцию строк. Использование select означает, что вы только перебираете коллекцию один раз.

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 
Смежные вопросы