2013-12-16 5 views
1

내 양식에 2 개의 목록 상자가 있습니다. 첫 번째는 배열에서 채우고 Date Time picker의 값과 관련된 파일 이름을 표시합니다. 해당 항목을 두 번 클릭하면 두 번째 목록 상자로 이동하고 첫 번째 목록에서 지우고 관련 파일이 한 디렉터리에서 다른 디렉터리로 전송됩니다. 내가 가진 문제는 응용 프로그램이 닫히고 파일 이름이 두 목록 상자에 모두 나타나면 채우기가로드 이벤트의 일부이기 때문입니다.목록 상자에서 다른 항목이 나타나면 항목을 제거하십시오.

개체가 1 텍스트 상자에 나타나면 다른 개체에 나타나지 않아야한다고 말하는 방법이 있습니까?

나는 해봤 다음하지만 다시 개방 아직도 내가 그것을

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 

에서 개체를 표시

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

당신의 대답은 치료를 작동합니다.

은 또한 다음 줄을

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

다시 한번 감사

+0

천만에요 개정

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 루프를 제외했습니다. – tinstaafl

+0

@tinstaafl 약간의 문제가 있습니다. 목록 상자에 두 개의 항목이있는 경우 두 번 클릭하면 선택 항목뿐만 아니라 둘 모두가 제거됩니다. – elmonko

+0

RemoveAt (selectedindex) 또는 이와 유사한 항목을 사용해보십시오. 항목 자체가 아닌 특정 색인 만 찾습니다. – tinstaafl

1

목록 상자의 Contains 메서드는 컨트롤 컬렉션이 항목 collectio가 아닌지 확인합니다. 엔. lstProgress.Items.Contains(item)이어야합니다. 또한 DirectoryInfo 클래스의 GetDirectories를 사용하여 directoryinfo 객체를 직접 가져올 수 있습니다.

lstPlanned가 lstProgress에 추가 할 때 각 항목이 포함되어 있는지 확인하면 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 
관련 문제