SQL Ergebnisse in Listbox anzeigen und weiterverarbeiten

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Rootbob91.

    SQL Ergebnisse in Listbox anzeigen und weiterverarbeiten

    Hi allerseits,
    ich habe ein Problem auf dass ich hier bisher noch keine Antwort gefunden habe. Ich bin recht neu in der VB Materie. Habe bisher MySQL nur in Verbindung mit PHP benutzt und muss bestimmt noch einiges lernen, also bitte habt ein bischen nachsicht.
    Ich habe ein Programm das Daten aus einer MYSQL Tabelle ausliest und diese in einer Listbox anzeigt. Das klappt auch sehr gut. Bei php hatte ich mir die Ergebnisse ebenfalls immer so in einer Tabelle anzeigen lassen. Durch hidden Attribute konnte ich das die IDs der Einträge abfregen fall ein Benutzer einen Tabelleneintrag anklickt. Mein Plan war jetzt in VB das gleiche mit der ListBox zu machen. Ich habe also unter der Listbox nen Button eingefügt. Wenn der User jetzt einen eintrag wählt und den Button drückt soll sich eine neue Form öffnen wo der Eintrag dann mit allen Details angezeigt werden soll. Leider habe ich bei VB keine hidden Attribute und weiss jetzt nicht wie ich an die ID der Einträge kommen soll, weil die ListBox Items ja nur als String vorliegen.
    Ich hoffe ich konnte mein Problem deutlih machen und es hat jemand einen Lösungsansatz für mich.
    Danke und beste Gruß
    BeKos
    Jo, musst du deine Tabelle als DataSource der ListBox angeben. Dann mit Display-/ValueMember arbeiten.

    Lb.DisplayMember = "Spalte die angezeigt werden soll"
    Lb.ValueMember = "Name ID Spalte"

    Beim Click Event dann einfach den ValueMember abfragen und verarbeiten.

    Übrigens, die ListBox kann ganze Objekte fassen, nicht nur stupide Strings.
    "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 2 mal editiert, zuletzt von „mrMo“ ()

    Hallöchen, soweit hat mrMo schon alles gesagt.

    Schau dir mal mein Beispielprojekt an, dort hättest du den "gecodeten Weg" mitn paar Erklärungen.
    Dateien
    • MySQL ListBox.zip

      (71,57 kB, 274 mal heruntergeladen, zuletzt: )
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    hmmm... leider stehe ich schon ziemlich früh auf dem Schlauch :( Ich habe mir das Beispielprogramm mal angeschaut und versucht das auf mein Projekt zu übertragen. Hier mein Code:

    VB.NET-Quellcode

    1. Imports MySql
    2. Imports MySql.Data
    3. Imports MySql.Data.MySqlClient
    4. Public Class frmOffeneStunden
    5. Private Sub frmOffeneStunden_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. 'Deklaration der Variablen
    7. Dim con As New MySqlConnection
    8. Dim cmd As New MySqlCommand
    9. Dim dreader As MySqlDataReader
    10. con.ConnectionString = "server=127.0.0.1; user ID=****; password=*****; database=****"
    11. cmd.Connection = con
    12. cmd.CommandText = "SELECT * FROM stunden WHERE Abrechnung ='0' ORDER BY Datum"
    13. Try
    14. con.Open()
    15. dreader = cmd.ExecuteReader
    16. Do While dreader.Read
    17. 'Variablen vorbereiten
    18. Dim date_richtig As Date
    19. date_richtig = dreader("Datum")
    20. Dim dauer_richtig As Double
    21. dauer_richtig = dreader("Dauer") / 60
    22. 'Items in die Liste einfügen
    23. lbOffeneStunden.Items.Add(date_richtig & " | " & dreader("Ort") & " | " & dreader("Taetigkeit") & " | Dauer(min.):" & dauer_richtig)
    24. lbOffeneStunden.ValueMember = dreader("SiD")
    25. Loop
    26. con.Close()
    27. Catch ex As Exception
    28. MsgBox(ex.Message)
    29. End Try
    30. End Sub
    31. Private Sub butDetails_Click(sender As Object, e As EventArgs) Handles butDetails.Click
    32. Dim value = CShort(lbOffeneStunden.SelectedValue)
    33. MsgBox(value.ToString & "SiD wurde gewählt!")
    34. End Sub
    35. End Class


    Ich habe hier erstmal einfach nur eine mit Strings gefüllte Liste. Der Plan ist das jeder Zeile während der Loop schleife eine ID (hier die SiD aus der DB) gegeben wird die ich dann auslesen kann und in dr MsgBox anzeigen kann, aber bisher zeigt er mir als SiD immer nur die Null an, also schätze ich mal das er gar nichts übergeben bekommt.

    edit: Ich denke es liegt daran dass ich meine SQL Tabelle nicht als DataSource angegeben habe, allerdings ahbe ich auch keine Idee wie ich das machen soll.

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

    Update: Ich habe es jetzt hinbekommen die SQL Tabelle der ListBox als DataSource zu geben. Jetzt funktioniert auch alles wie es soll und die richtigen IDs werden in der MsgBox angezeigt. ABER im Gegensatz zu vorigen Version steht jetzt in der Box nur noch der Display Member und nicht der Inhalt der anderen Felder. Gibt es ne Möglichkeit mehr als nur ein Feld pro Zeile anzeigen zu lassen?
    Wenn du die SQL Tabelle direkt als DataSource angegeben hast wäre mir keine Möglichkeit bekannt. Ich arbeite ausschließlich code-basiert und nicht mit dem Dataset + Datasource-zurechtklick-Designer.
    Ggf. kannst du die automatisch generierte SQL Abfrage so anpassen, dass diese z.B. das Feld "KompletterName" bei einem Fall von Vorname und Nachname ausgibt:

    Nur ein Beispiel was mir in MySQL Gerade einfällt:

    SQL-Abfrage

    1. SELECT CONCAT(Firstname, ' ', Lastname) AS 'KompletterName' FROM user


    Wenn man dann den DisplayMember der ListBox auf KompletterName stellt, hat man ggf. das gewünschte Ergebnis.

    Anhand meines Code-Beispiels müsstest du nur z.B. ne Readonly Property hinzufügen:

    VB.NET-Quellcode

    1. Public ReadOnly Property KompletterName
    2. Get
    3. Return String.Format("{0} {1}", Vorname, Nachname)
    4. End Get
    5. End Property


    Und der ListBox via DisplayMember sagen, dass Sie diese Eigenschaft anzeigen soll.

    PS: Das mit Vorname Nachname User war nur ein Beispiel..

    Noch einige Empfehlungen:
    - Versuche bei Klassen die IDisposable implementieren mit dem Using -Schlüsselwort zu arbeiten
    - Verwende statt der veralteten MsgBox() die MessageBox.Show()-Variante
    - Verwende für Klassen den passenden Konstruktor (statt die Werte einzeln zuzuweisen)
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Hi,
    ich habe ein Tut gefunden wo das erklärt wird wie man eine Tabelle als ds übergeben kann. Ich versuche die durchklick-assistenten auch zu umgehen wenn möglich :)

    Hier mein Code:

    VB.NET-Quellcode

    1. Public Class frmListBoxTest
    2. Private Sub frmListBoxTest_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. 'Variablen deklarieren
    4. Dim con As MySqlConnection = New MySqlConnection("server=localhost;user id=;database=")
    5. Dim cmd As New MySqlCommand
    6. Dim da As New MySqlDataAdapter
    7. Dim ds As New DataSet
    8. con.Open()
    9. 'Adapter füllen
    10. With cmd
    11. .Connection = con
    12. .CommandText = "SELECT * FROM stunden WHERE Abrechnung ='0'"
    13. End With
    14. da.SelectCommand = cmd
    15. da.Fill(ds, "stunden")
    16. 'Listbox füllen
    17. With ListBox1
    18. .DataSource = ds.Tables(0)
    19. .DisplayMember = "DisplayString"
    20. .ValueMember = "SiD"
    21. End With
    22. con.Close()
    23. End Sub
    24. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    25. MsgBox(ListBox1.SelectedValue.ToString)
    26. End Sub
    27. End Class


    Damit funktioniert es jetzt. Beim erstellen eines neuen Datensatzes wird jetzt auch ein DisplayString erzeugt, welchen ich dann anzeigen lasse.

    Danke für die Allg. Tipps ich versuche mir das zu Herzen zu nehmen bei meinen weiteren VB Experimenten!
    Ich hab mir nochmal erlaubt ein Projekt zu erstellen ;).

    PS: Für Danksagungen gibt es alternativ unter jedem Post einen Hilfreich! Knopf 8-) .
    PPS: Vergiss nicht das Thema als ereldigt zu markieren :thumbup: .

    LG Root
    Dateien
    • ListboxTest.zip

      (41,83 kB, 150 mal heruntergeladen, zuletzt: )
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..