Links aus einer Datei in eine CheckedListbox laden?

  • VB.NET

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von danii1005.

    Links aus einer Datei in eine CheckedListbox laden?

    Hallo,

    Ich möchte Links zu mehreren Programm in einer *.txt (oder vllt *.xml?) Datei im Internet speichern und diese in eine checkedListbox laden. Die abgehackten Programmnamen sollen aus dem Internet downgeloaded und gespeichert werden.
    Ich habe leider überhaupt Keinen Plan wie ich das machen könnte. Vielleicht die Daten über einen IO befehl lesen aber sonst.... :S
    Ich bitte um eure Hilfe.

    lg
    Danii
    Vorweg: IO ist kein Befehl sondern ein Namespace :sleeping:

    Wie du schon sagtest: Du hast z.B. ein Textfile mit den Links.
    Jetzt ließt du alle Zeilen in deine ListBox mit einer Schleife ein und fertig ists...

    LG
    Das Problem ist, dass ich jedem Link einen Namen zuweisen möchte.

    Zb Link: Test.at. Name Test

    In der checkedlistbox soll der Name stehen und nicht der Link.
    Und dann soll das ganze heruntergeladen werden.
    Am besten wärs wenn man den Fortschritt mit einer progressbar sichtbar machen könnte.

    Lg
    Danii1005
    Hey,

    wie weist du den Programmen bzw. deinen Links den Namen zu? Steht dieser in der Textdatei bereits dabei?

    Sollte der Name bereits in der Textdatei stehen (jeweils durch ein bestimmtes Zeichen vom Link getrennt), dann kannst du die Textdatei einlesen, den Inhalt jeweils an diesem Zeichen trennen (Befehl .split()), den Namen in die Checkedlistbox eintragen und den dazugehörigen Link in einer Liste (List (of String)) vermerken.

    Beim Aufrufen (Herunterladen) kannst du jetzt zu jedem Namen des passenden Link aus der Liste entnehmen, weil der Index (die Position innerhalb) in beiden Fällen gleich ist.

    Ich habe jetzt zu jedem Schritt stichwortartig die passenden "Befehle" hinzu-geschrieben. Du solltest also mit etwas Engagement die Lösung hin-bekommen...

    Gruß, Manschula
    Ich habe das nun mal probiert, doch schon beim Einlesen kommt mein erster fehler :(

    VB.NET-Quellcode

    1. Try
    2. For Each text As String In IO.File.ReadAllText("C:\plugins.txt").Split("_")
    3. CheckedListBox1.Items.Add(text)
    4. Next
    5. Catch ex As Exception
    6. MessageBox.Show("Konnte Aktuelle Liste nicht abrufen")
    7. End Try


    Die erste Zeile wird noch normal angezeigt. Bei der 2. gibt es nurnoch den Link.

    lg
    Danii
    Hey,

    du liest die Textdatei zwar ein und splittest Sie auch am Trennzeichen auf, doch die Verarbeitung ist falsch. Ich habe dir mal ein etwas ausführlicheres Beispiel zusammengestellt; ich denke, die einzelnen Code-Abschnitte samt ihrer jeweiligen Funktion werden dadurch deutlicher.

    Meine Textdatei sieht wie folgt aus:

    Quellcode

    1. www.google.de_Google
    2. www.spiegel.de_SPON
    3. www.chip.de_Chip online

    Zuerst der Link, anschließend der Name. Getrennt werden beide Teile durch das Trennzeichen "_"

    Daraus ergibt sich für mich folgender Code:

    VB.NET-Quellcode

    1. Try
    2. Dim link_liste As New List(Of String) ' Liste beinhaltet die Links
    3. Dim inhalt_textdatei() As String = IO.File.ReadAllLines("G:\test.txt", System.Text.Encoding.Default) ' Textdatei einlesen
    4. For Each zeile As String In inhalt_textdatei ' Textdatei zeilenweise durchgehen....
    5. Dim inhalt_zeile() As String = zeile.Split(CChar("_")) ' ...Zeile am Trennzeichen aufsplitten
    6. CheckedListBox1.Items.Add(inhalt_zeile(1)) ' ....Name in Checkedlistbox eintragen (1 = zweiter Teil)
    7. link_liste.Add(inhalt_zeile(0)) ' ...dazugehörigen Link in Liste eintragen (0 = erster Teil)
    8. Next
    9. Catch ex As Exception
    10. ' Fehler ausgeben
    11. MessageBox.Show(ex.Message)
    12. End Try

    Die Textdatei wird zeilenweise eingelesen; anschließend wird jede Zeile für sich behandelt. Der Inhalt der Zeile wird am Trennzeichen aufgetrennt: der vordere Teil (der Link) wird in die Liste verschoben, der hintere Teil (der Name) wird in die CheckedListBox eingetragen. Wichtig hierbei ist: das ganze beginnt bei 0, nicht bei 1. Der erste Teil der Zeile (vor dem Trennzeichen) ist also = 0, der zweite Teil (nach dem Trennzeichen) hat die Stelle 1

    Ich hoffe, das (grundlegende) Prinzip wurde hierdurch deutlicher.

    Gruß, Manschula
    Dadurch hab ich das ganze nun verstanden. Vielen dank.

    Die Datei die ich abrufen möchte befindet sich im Internet auf einem Webspace. Ich muss die Datei zuerst herunterladen und in C:\ speichern. Sprich:

    VB.NET-Quellcode

    1. My.Computer.Network.DownloadFile("http://www.****.com/plugins/plugins.txt", "C:\plugins.txt")

    Eine möglichkeit die Datei direkt abzurufen ohne sie downloaden zu müssen gibt es aber nicht oder?

    lg
    Danii
    Ich werds versuchen. Danke für den Tipp.

    Eine Letzte Frage habe ich noch :D

    Die Links werden jetzt in der Liste (Plugins_links) gespeichert. Wie kann ich aber nur die Links der in der CheckedListbox markierten Items in diese Liste hinzufügen?

    VB.NET-Quellcode

    1. For Each item As Object In CheckedListBox1.CheckedItems
    2. plugins_links.Items.Add(inhalt_zeile(1))
    3. Next

    Habe ich mir gedacht müsste eigentlich funktionieren.

    lg
    Danii
    Hey,

    du hast hier einen Denkfehler: die Links werden ja bereits am Anfang in die Liste kopiert. Wenn du nur die Links der markierten Namen in einer Liste willst, benötigst du eine zweite separate Liste. Das Löschen der nicht markierten Namen und damit der Links aus der Liste fällt weg, weil sich ansonsten auch die Indizes verschieben und somit die Namen nicht mehr mit den Links übereinstimmen.

    Gruß, Manschula
    Also irgendwie denke ich zu kompliziert :S

    Die Namen werden von den Links getrennt.
    Die Namen werden dann in der Checkedlistbox angezeigt und die Links werden in einer Liste gespeichert.

    Wie du schon beschrieben hast:

    VB.NET-Quellcode

    1. CheckedListBox1.Items.Add(inhalt_zeile(0)) ' ....Name in Checkedlistbox eintragen (1 = zweiter Teil)
    2. plugins_links.Add(inhalt_zeile(1)) ' ...dazugehörigen Link in Liste eintragen (0 = erster Teil)


    Ich will die Links der markierten Namen in eine Liste eintragen.

    VB.NET-Quellcode

    1. Dim linkliste As New List(Of String)
    2. For Each Link As Object In CheckedListBox1.CheckedItems
    3. linkliste.Add(inhalt_zeile(1))
    4. Next


    Aber hier verstehe ich das ganze nicht. Denn es werden alle Links in die Liste geladen.
    Um das zu überprüfen habe ich statt der linkliste eine Listbox genommen.

    VB.NET-Quellcode

    1. For Each Link As Object In CheckedListBox1.CheckedItems
    2. listbox1.items.Add(inhalt_zeile(1))
    3. Next


    Aber hier werden alle Links gelistet.

    lg
    Danii
    Hey,

    keine Angst - es ist nur ein kleiner Denkfehler. Du hast korrekterweise eine zweite Liste angelegt, in der jetzt die Links der ausgewählten Namen eingetragen werden sollen. Du darfst dann allerdings nicht mehr "inhalt_zeile(1)" nehmen.

    VB.NET-Quellcode

    1. For Each Link As Object In CheckedListBox1.CheckedItems
    2. listbox1.Items.Add(Link)
    3. Next

    Du gehst doch über die For Each-Schleife alle ausgewählten Einträge durch; also liegt es doch auch nahe, dass du diese Link(s) auch in deine Liste kopierst... oder? ;) Zur Verdeutlichung: an welcher Stelle im Code wurde "inhalt_zeile()" verwendet und was repräsentiert es?

    Gruß, Manschula
    Hallo,

    Irgend etwas verdrehe ich jetzt nochimmer.
    In der Listbox werden jetzt die Markierten namen gelistet. aber nicht die Links. Die sollten ja eigentlich in der Liste gespeichert werden. ?(
    Deshalb habe ich mir gedacht :

    VB.NET-Quellcode

    1. Dim linkliste As New List(Of String)
    2. For Each Link As Object In CheckedListBox1.CheckedItems
    3. linkliste.Add(inhalt_zeile(1))
    4. Next


    Danke dass du dir Zeit für nen Noob wie mich nimmst :D ... ich stell dir bestimmt schon die 100. unnötige Frage :thumbup: .
    Hey,

    genau. In meinem Beispiel oben wurden die ausgewählten Namen in die Listbox kopiert. Du willst aber die dazugehörigen Links. Also musst du den entsprechenden Link aus der Linkliste heraussuchen. Hier musst du beachten: steht in meiner CheckedListbox der Name an der Position 2, steht der Link in der Linkliste auch an der Stelle 2. Das kommt daher, da wir beim Einlesen der Textdatei beide Listen synchron befüllt haben.

    Also bauen wir jetzt einmal die Schleife um:

    VB.NET-Quellcode

    1. ListBox1.Items.Clear() ' Listbox leeren, falls noch Einträge vorhanden
    2. For i As Integer = 0 To CheckedListBox1.Items.Count - 1 ' CheckedListBox komplett durchlaufen...
    3. ' ... prüfen, ob der Name ausgewählt wurde...
    4. If CheckedListBox1.CheckedItems.Contains(CheckedListBox1.Items.Item(i)) = True Then
    5. ' ...und anschließend den passenden Link aus der Liste nehmen:
    6. ListBox1.Items.Add(link_liste(i))
    7. End If
    8. Next

    Gruß, Manschula
    Hallo,

    Ich habe den Code jetzt mal ausprobiert und bekomme folgende Fehlermeldung:

    Der Index lag außerhalb des Bereichs. Er muss nicht negativ und kleiner als die Auflistung sein.
    Parametername: index


    Also darf der Counter nicht >0 sein?

    PS.: Ich will kein Copy & Paste machen, will ja was dabei Lernen. Falls es jetzt so rüber kommen sollte ;P

    lg
    Danii

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „danii1005“ ()

    Hey,

    ich sehe zwar keine Fehlermeldung (hast du vergessen zu posten) und bei mir kommt auch keine Fehlermeldung, bzw. der Code funktioniert. Du hast also irgendow noch einen versteckten Fehler.

    Count gibt die Anzahl der in der CheckedListBox befindlichen Einträge zurück. Kleiner 0 geht also nicht...

    Gruß, Manschula
    Nur um es nochmal zu wiederholen, ob ichs auch verstanden hab^^:

    Das bedeutet also, dass der Counter die Zahl der Items in der Box ist.

    Also ist es irgendwie klar dass das ganze nicht funktioniert.

    Edit:

    Muss das alles im selben Sub passieren oder kann ich die überprüfung welche Items markiert wurden auf einem andern Button zuweisen?

    lg
    Danii
    Genau,

    Counter gibt dir zurück wie viele Items (also Namen) in der CheckedListBox sind. Ergo muss es auch > 0 sein. Ist doch logisch, oder?! ;)

    Jetzt mal hier mein kompletter Code. Ich habe 1x Button (Button1), 1x CheckedListBox (CheckedListBox1), 1x Liste (liste_links) sowie 1x Listbox (Listbox1). Beim Laden der Form wird die Textdatei eingelesen, die Namen in die CheckedListBox übertragen und die Links in die Liste. Nach einem Klick auf den Button werden die Links der Namen, welche ausgewählt wurden, in die Listbox kopiert.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim link_liste As New List(Of String) ' Liste beinhaltet die Links
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    4. ListBox1.Items.Clear() ' Listbx leeren, falls noch Einträge vorhanden
    5. For i As Integer = 0 To CheckedListBox1.Items.Count - 1 ' CheckedListBox komplett durchlaufen...
    6. ' ... prüfen, ob der Name ausgewählt wurde...
    7. If CheckedListBox1.CheckedItems.Contains(CheckedListBox1.Items.Item(i)) = True Then
    8. ' ...und anschließend den passenden Link aus der Liste nehmen:
    9. ListBox1.Items.Add(link_liste(i))
    10. End If
    11. Next
    12. End Sub
    13. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    14. Try
    15. Dim inhalt_textdatei() As String = IO.File.ReadAllLines("G:\test.txt", System.Text.Encoding.Default) ' Textdatei einlesen
    16. For Each zeile As String In inhalt_textdatei ' Textdatei zeilenweise durchgehen....
    17. Dim inhalt_zeile() As String = zeile.Split(CChar("_")) ' ...Zeile am Trennzeichen aufsplitten
    18. CheckedListBox1.Items.Add(inhalt_zeile(1)) ' ....Name in Checkedlistbox eintragen (1 = zweiter Teil)
    19. link_liste.Add(inhalt_zeile(0)) ' ...dazugehörigen Link in Liste eintragen (0 = erster Teil)
    20. Next
    21. Catch ex As Exception
    22. ' Fehler ausgeben
    23. MessageBox.Show(ex.Message)
    24. End Try
    25. End Sub
    26. End Class

    Gruß, Manschula
    Hey,

    die Zeile, bzw. die Zahlen in der Zeile:

    VB.NET-Quellcode

    1. For i As Integer = 0 To CheckedListBox1.Items.Count - 1

    darfst du nicht ändern. Das ist eine Schleife, welche die Liste von Anfang bis Ende durchgeht. "0" ist der Startpunkt (erster Eintrag der Liste) bis "CheckedListBox1.Items.Count - 1" (letzter Eintrag der Liste).

    Das ist in der Tat etwas verwirrend.

    Kleines Beispiel: Eine Liste enthält 5 Einträge. Count gibt in diesem Fall auch 5 zurück. Die Schleife beginnt aber bei 0. Der Erste Eintrag hat als Position auch 0 und nicht 1. Der letzte Eintrag (eigentlich die 5), hat als Position aber 4. Also wird bei der Schleife bei 0 begonnen und bei Count eine 1 abgezogen. Somit passt es wieder ;)

    Gruß, Manschula