2016-05-04 14 views
1

IntroVb.net laden mehrere Zeilen aus einer Textdatei zu verschiedenen Listboxen

Okay, so habe ich eine load und eine save Taste. Ich speichere alle listbox items in eine .txt Datei und lade sie dann in die Listbox.

Nun, das wäre ziemlich einfach, wenn es nur eine Listbox wäre. Mein Problem ist, dass es 9 Listenfelder und nur eine TXT-Datei, die alle Elemente aus den 9 Listenfeldern enthält. Ich möchte keine 9 verschiedenen .txt-Dateien. Denken Sie daran, dass die Anzahl der Listeneinträge variiert.

Dies ist, wie die Taste save Ausgänge an die .txt-Datei (Eine andere Version weiter unten)

Channel 1 
c:\folder\folder 

Channel 2 
\\server\folder\foldera 
\\server\folder\folderb 

Channel 3 
\\anotherserver\foldera 
\\anotherserver\folderb 
\\anotherserver\folderc 
\\anotherserver\folderd 
\\anotherserver\foldere 

Channel 4 
\\somepath\folder\folder\foldera 

Channel 5 
\\server\folder\foldera 

Channel 6 
\\server\folder\foldera 

\\server\folder\foldera 

Channel 8 
\\server\folder\foldera 

Channel 9 
\\server\folder\foldera 

Jeder Kanal ist die Listenfelder und die Wege sind die Elemente, die die jeweils List-Box enthält. Hier

ist mein speichern btnsave.click

Dim configfile As String = "C:\Applicationpath\Config\" & System.DateTime.Now.ToString("yyyyMMdd") & "_Config.txt" 

Using fs As FileStream = File.Create(configfile) 
fs.Close() 
End Using 

Write_Configfile() 

... und Write_config() macht folgendes:

Dim objWriter As New System.IO.StreamWriter(configfile, True) 
    Try 
     objWriter.WriteLine("Channel 1") 
     For Each itm1 As String In Me.lbchannel1.Items 
      objWriter.WriteLine(itm1) 
     Next 
     objWriter.WriteLine(" ") 

     objWriter.WriteLine("Channel 2") 
     For Each itm2 As String In Me.lbChannel2.Items 
      objWriter.WriteLine(itm2) 
     Next 
     objWriter.WriteLine(" ") 

und den ganzen Weg zu kanalisieren 9. Es ist wahrscheinlich ein einfacher Weg, dies zu tun, Ich kenne.

Das Problem und die Frage

Nun zur load Taste. Ich dachte, wenn ich jede Listbox aus einem bestimmten Teil der Textdatei laden könnte, würde es mir gut gehen. Ich würde gerne sagen "Hey, fügen Sie alle Elemente zu Kanal 1 (listbox1), die zwischen" Channel 1 "und" Channel 2 "in der Konfigurationsdatei geschrieben werden - und so weiter auf Kanal 9. Und das ist, wo ich bin stecken.

ich muss readline nach einem bestimmten Wort oder zwischen bestimmten Wörtern. Nicht eine bestimmte Zeile gelesen, denn wie ich schon sagte, wie viele Elemente die Listboxen variiert enthält.

beachten Sie, dass ich das speichern ändern Ausgabe wie folgt aussehen, wenn das macht die Sache einfacher:

c1:c:\folder\folder 
c2:\\server\folder\foldera 
c2:\\server\folder\folderb 
'and so on... 

So zu meinem Versuch, die dies gewesen:

Aber das gibt mir diesen Fehler {"Conversion from string C:\Applicationpath\Config\20160405_config.txt to type integer is not valid."} und ich bin sicher, es ist nicht der richtige Weg, es zu tun.

Antwort

2

Wenn Sie die Anpassung Namen Ihrer Listboxen und die Überschriften in Ihrer Textdatei, damit sie gleich sind, gibt es eine generische Lösung dafür. zu Channel1 bis zu Channel9

ändern Write_config() so dass es Channel1 statt Channel 1 etc .: schreiben

Dim objWriter As New System.IO.StreamWriter(configfile, True) 
For Each o As ListBox In Me.Controls.OfType(Of ListBox).Where(Function(c) c.Name.StartsWith("Channel")) 
    objWriter.WriteLine(o.Name) 
    For Each itm As String In o.Items 
     objWriter.WriteLine(itm1) 
    Next 
Next 

auch die Namen Ihrer listbox Kontrollen ändern.

Neue Textfile würde wie folgt aussehen:

Channel1 
c:\folder\folder 

Channel2 
\\server\folder\foldera 
\\server\folder\folderb 
... 

nun die Listenfelder ändern Sie den Code für die Befüllung:

Using reader As New StreamReader(OpenFileDialog1.FileName.ToString) 
     Dim currentListBox As ListBox = Nothing 

     While reader.Peek > -1 
      Dim line As String = reader.ReadLine() 
      If Not String.IsNullOrEmpty(line) Then 
       Dim tmpListBox = Controls.Find(line, false) 'Try to find listbox according to line 
       If tmpListBox.Any() Then 'It´s a listbox name 
        currentListBox = DirectCast(tmpListBox(0), ListBox) 
       Else 'It´s a folder name 
        currentListBox.Items.Add(line) 
       End If 
      End If 
     End While 
End Using 
+0

in Ihrem ersten Codebeispiel, Sie schreiben nur die 9 Kanäle, aber nicht, was die Listbox enthält ... –

+0

Yep. Danke für den Tipp. –

+1

Yay, genau was ich wollte. Lief wie am Schnürchen. Vielen Dank! – MadsTheMan

1

Entfernen Sie den Dateinamen von Ihrer ReadLine. Fügen Sie dann einen Split- und Select-Case hinzu, um festzulegen, welches Steuerelement aufgefüllt werden soll.

 Using reader As New StreamReader(OpenFileDialog1.FileName.ToString) 
      Dim line As String = reader.ReadLine() 
      Dim values() As String = line.Split(":") 
      Select Case values(0) 
       Case "C1" 
        lbchannel1.items.add(values(1)) 

       Case "C2" 
        lbchannel2.items.add(values(1)) 
      End Select 

     End Using 
+0

Fall 'C2': lbchannel 2 (nicht 1) ... Auch wird, wie Sie handhaben, wenn es zwanzig Kanäle gibt? Select case ist nett, aber es gibt in der Regel eine bessere Lösung –

2

Für Sie Funktion speichern, Sie mit so etwas wie dies gehen kann:

Using objWriter As New System.IO.StreamWriter(configfile, True) 
    Try 
     'We will run through each channel 
     For i = 1 to 9 
      objWriter.WriteLine("Channel " & i.ToString()) 
      'We find the ListBox based on its name 
      Dim LB As ListBox = CType(Me.Controls.Find("lbchannel" & i.ToString(), True), ListBox) 
      For Each itm As String In LB.Items 
       objWriter.WriteLine(itm) 
      Next 
      objWriter.WriteLine("") 
     Next 
    Catch ex as Exception 
     'Exception Handling here 
    End Try 
End Using 

Dann werden Sie die Datei die folgende Art und Weise zu laden:

Using reader As New StreamReader(OpenFileDialog1.FileName) 
    Dim Line As String = reader.ReadLine() 
    Dim CurrentChanel as Integer = 0 
    Dim LB As ListBox = Nothing 
    While Not IsNothing(Line) 'It will be Nothing when file is over 
     If Line.StartsWith("Channel ") Then 
      'We will increment CurrentChannel, as we changed the section 
      CurrentChannel += 1 
      LB = CType(Me.Controls.Find("lbchannel" & CurrentChannel.ToString(), True), ListBox) 
     Else If Line <> "" Then 
      LB.Items.Add(Line) 
     End If 
     Line = reader.ReadLine() 
    End While 
End Using 
Verwandte Themen