Items in Listbox finden über andere Listbox

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Skino.

    Items in Listbox finden über andere Listbox

    Ich habe 2 Listboxen. Zu jedem Item in Listbox 1 möchte ich ein passendes Item in Listbox2 finden, das mit dem Inhalt des Listbox1.Items beginnt. Ich möchte also die Items der beiden Listbox zueinander zuordnen, wobei Listbox 1 die Suchbegriffe enthält. Kompliziert erklärt aber ich hoffe ihr versteht. :S

    Beispiel
    Listbox1 enthält AAA
    BBB
    CCC
    DDD

    Listbox2 enthält BBB1234äö
    AAAdfswer
    CCCde43löä

    ich möchte dann die Zuordnung AAA -> AAAdfswer
    BBB -> BBB1234äö
    CCC -> CCCde43löä
    Da hänge ich mal wieder. Ich mache das im Moment so, das ich jede Zeile der Listbox1 einem String zuordne und dann prüfe, ob Listbox2.Item mit diesem String beginnt. Dann das nächste Item und so weiter.
    Aber das geht sicher effektiver. Ich habe nur keine Ahnung wie. ?(
    Man(n) kann auch ohne Hunde leben, aber es lohnt nicht (Heinz Rühmann)
    Das habe ich schon häufiger gemacht, nur nicht mit ListBoxen, sondern mehr mit Arrays. Wenn du eine Sortierung reinkriegst, dann läuft deine Schleife weniger lange, weil du Punkte definieren kannst wo du weißt das kein weiterer Eintrag gefunden wird.
    Ich sag mal in alphabetischer Reihenfolge müsstest du wenn du AAA suchst nicht weiter suchen sobald das dritte Zeichen ein B ist. Umgekehrt kannst du bei DDD an der Stelle einsteigen wo du beim vorherigen Suchergebnis ausgestiegen bist.
    Wie man ListBoxen sortiert kann ich dir aber nicht sagen^^ Möglich dass das händisch zu lösen ist und dementsprechend hilft es kein bisschen...
    Sollen die beiden Listboxen (LB) gleichzeitig geladen werden? Das macht ja keinen Sinn, glaube ich. Du willst also in LB1 etwas auswählen und in LB2 wird dann entsprechend geladen oder ausgewählt?

    Also für mich würde es nur Sinn ergeben, wenn du eine LB1 lädst, eine Auswahl triffst und dann entsprechend das zugehörige in LB2 geladen wird.
    Dann wäre es ja ein Array oder ein Dictionary .
    Danke für eure Antworten. Beide Listboxen sind gleichzeitig geladen. Ich muss ja in Listbox2 nach einem Item suchen das mit dem String aus dem gewählten Item von Listbox1 beginnt. Und das für alle Items aus Listbox1. Alternativ könnte der Inhalt von Listbox2 auch in einer Textdatei oder Textbox stehen.
    Man(n) kann auch ohne Hunde leben, aber es lohnt nicht (Heinz Rühmann)
    Jo, wenn man die Daten hätte, die in den Listboxen angezeigt werden - dann wäre das ein Klacks, und mache ich mit Linqs.
    Aber wenn man nur Listboxen hat, ist natürlich schlecht.

    Also ein bischen sind die Daten ja schon da:
    Listbox1 enthält AAA
    BBB
    CCC
    DDD

    Listbox2 enthält BBB1234äö
    AAAdfswer
    CCCde43löä
    Nur kann ich noch nicht loslegen mit Linq, weil welchen Datentyp haben denn AAA, BBB, CCC und DDD?
    Und welchen Datentyp hat BBB1234äö, AAAdfswer und CCCde43löä?
    Und dann soll es noch Zuordnungen geben:

    Skino schrieb:

    ich möchte dann die Zuordnung AAA -> AAAdfswer
    BBB -> BBB1234äö
    CCC -> CCCde43löä
    Welchen Datentyp hat denn AAA -> AAAdfswer und BBB -> BBB1234äö?
    Wenn ich das weiss, kann ich was raushauen.
    Aber natürlich nur mit Daten.
    Eine weitere Listbox kann ich nicht auswerfen.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Nochmals Danke für eure Zeit. Die Daten werden aus 2 Textdateien eingelesen und sind vom Typ String. Auch das Ausgabe Format soll String sein.
    Man(n) kann auch ohne Hunde leben, aber es lohnt nicht (Heinz Rühmann)
    Coole Sache. Vielen Dank. Das schließt aber die Listboxen nicht ein. Ich muss dann den Inhalt der Listboxen oder der zugrunde liegenden Texte erst einmal in die liste1 und liste2 einlesen, oder?
    Man(n) kann auch ohne Hunde leben, aber es lohnt nicht (Heinz Rühmann)
    Wie können die Textdatei-Inhalte in der ListBox stehen, wenn du die nirgendwo einliest?^^

    Mit File.ReadAllLines hast du jede Zeile der Datei direkt in eine Zelle eines Arrays gelesen. Falls dort (in der Datei) die Einträge zeilenweise getrennt sind, ist das womöglich die Variante der Wahl.

    Falls nicht bekommst mit File.ReadAllText sowas wie @ErfinderDesRades hat; einen einzigen String, den du selbst noch splitten musst. (Der Split gibt dann auch ein Array)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Mit FindString habe ich auch schon rumprobiert. Mein Problem war halt der Aufbau der Schleifen um die Abfrage durchzuführen.
    Werde morgen mal versuchen eure Tipps umzusetzen. Vielen Dank nochmals dafür.
    Man(n) kann auch ohne Hunde leben, aber es lohnt nicht (Heinz Rühmann)
    Und was soll passieren, wenn es mehrere potentielle Treffer gibt? Wenn in LB2 steht
    • AAA1
    • BBB1
    • BBB2
    • CCC1
    Wie soll dann die Zuordnung von LB1-Eintrag BBB aussehen? Nur BBB -> BBB1, nur BBB -> BBB2 oder gar BBB -> BBB1, BBB2?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Das ist ausgeschlossen auf Grund der Daten. Ich lese einen Flugsimulator-Flugplan aus (wer sich auskennt, es sind Corte-Routen von Jehell FMGS) und ordne den einzelnen Waypoints die geografischen Koordinaten zu. Der Flugplan und die Datei mit den Koordinaten werden jeweils in eine Listbox geladen. Dann wird für jeden Waypoint im Flugplan die entsprechende Zeile aus de Koordinatendatei gesucht. Diese Zeile beginnt immer mit dem Waypoint-Namen, so das ich den Waypoint aus Listbox1 als Suchbegriff für Listbox 2 nehmen kann. Und das wiederholend für alle Waypoints im Flugplan. Das sind im Schnitt so 3 bis ca 15.
    EDIT: Listbox1 mit den Waypoints ist jetzt eine Combobox, damit der Nutzer die Route kurz überprüfen kann, aber das ändert nichts an der Problemstellung denke ich.
    Im Screenshot rot umrandet ist die Combobox mit den Waypoints für die darüber gewählte Route:
    Man(n) kann auch ohne Hunde leben, aber es lohnt nicht (Heinz Rühmann)
    Ah, »echte« Daten! Jetzt geht es doch mal weiter in die richtige Richtung.
    Ok, dann liest Du also die Wegpunkte in eine List(Of String) und die Wegpunkt-Koordinaten-Paare in eine andere. Aber Moment. Das ist Redundanz. Du brauchst nur eine List(Of Wegpunkt), wobei Wegpunkt eine Klasse mit den Properties Name und Koordinaten ist. Die Namen zeigst Du in der ListBox1 an. Aber Das Programm weiß dann automatisch auch, dass das nicht nur ein Name, sondern eine Wegpunkt-Klasseninstanz ist und kann somit automatisch auf die Koordinaten zugreifen. Stichwort korrektes DataBinding.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Die Daten werden eingelesen. Ein Flugplanungsprogramm erzeugt sie und speichert sie in einer Datei, die vom Autopilot gelesen werden kann und die er dann automatisch abfliegt, vereinfacht gesagt. Die Route im Beispiel ist von EDDN (Nürnberg) nach EDDW(Bremen). Das rot markierte sind die Wegpunkte der Route, die vom Flugplanungsprogramm eingefügt wurden. Dazu gibt es eine Liste, einen sogenannten AIRAC, der immer 30 Tage gültig ist, welcher Daten zu weltweit allen Wegpunkten enthält. Unter anderem auch die geografischen Koordinaten, die ich brauche. Anhand der Wegpunkte-Combobox will ich die Datendatei durchgehen und die Zeile finden, die mit dem jeweiligen Wegpunkt beginnt. Wenn ich die habe kann ich die in der selben Zeile stehenden Koordinaten an meine Map senden um so auf der Karte die Wegpunkte darzustellen.
    Man(n) kann auch ohne Hunde leben, aber es lohnt nicht (Heinz Rühmann)
    Und was hindert Dich daran, alle AIRAC-Wegpunkte bei Programmstart zu laden? Selbst wenn es 10 Millionen sind, ist es wahrscheinlich effizienter, diese in den RAM zu laden und dann zu durchsuchen als sie in einer Datei zu belassen und die große AIRAC-Datei 15x zu durchforsten.
    btw: Anbei ein DataBinding-Beispielprojekt, welches eine gedachte Möglichkeit ist. Alle AIRAC-Daten laden, gewählte Wegpunkte vom Programm hernehmen, Koordinaten verwenden.
    Dateien
    • WinFormsVB.zip

      (16,16 kB, 52 mal heruntergeladen, zuletzt: )
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Und was hindert Dich daran, alle AIRAC-Wegpunkte bei Programmstart zu laden? ...


    Mangelnde Kenntnisse würde ich sagen. :whistling: Vielen Dank für dein Beispiel. Werde ich mir ansehen.
    Man(n) kann auch ohne Hunde leben, aber es lohnt nicht (Heinz Rühmann)
    Diese Version funktioniert. Eine einfache Schleife die das gewünschte Ergebnis bringt und in eine Textbox einträgt, zur weiteren Verwendung:

    Quellcode

    1. ​For Each Wert As String In ComboBox2.Items
    2. For Each Cord As String In System.IO.File.ReadAllLines(".\Data\wpt.dll")
    3. If Cord.Contains(ComboBox2.SelectedItem) Then TextBox9.Text = TextBox9.Text & vbCrLf & Cord
    4. Next
    5. ComboBox2.SelectedIndex = ComboBox2.SelectedIndex + 1
    6. Next

    Man(n) kann auch ohne Hunde leben, aber es lohnt nicht (Heinz Rühmann)
    @Skino
    Du meist wohl eher sowas

    VB.NET-Quellcode

    1. Dim Lines() as String = System.IO.File.ReadAllLines(".\Data\wpt.dll")
    2. For Each Wert As Object In ComboBox2.Items
    3. For Each Cord As String In lines()
    4. If Cord.Contains(Wert.ToString()) Then TextBox9.Text &= vbCrLf & Cord
    5. Next
    6. Next

    1. Den SelectedIndex brauchst du hier nicht setzten da du bereits in der ersten Schleife durch alle Items iterierst.
    2. Zudem ist es nicht notwendig in jedem Schleifendurchlauf die Datei erneut auszulesen. Einmal reicht.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

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