Access Datenbank, Listbox, PictureBox

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Spiggle0511.

    Access Datenbank, Listbox, PictureBox

    Hallo!
    Ich bin neu hier!

    Also, ich fange einfach mal an: Ich habe eine Access Datenbank. In dieser habe ich als Spalten: ID, Name, Bildurl. Ich habe die ersten 2 Spalten in eine Listbox eingetragen. Das sieht dann so aus:
    Listbox
    ------------
    ID - Name |
    ID - Name |

    ID - Name |

    ------------
    Nun will ich wenn man einen Doppelklick auf eines dieser Einträge macht, sich ein Fenster öffnet und ein Bild mit der Url, die in der Datenbank eingetragen ist, anzeigt.
    Ich habe es soweit schon hinbekommen, doch er zeigt nicht das Bild des ausgewählten Items an, sondern das Bild des letzten Eintrages. Genug gefaselt... Hier der Code:

    VB.NET-Quellcode

    1. Private Sub lstTab_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles lstTab.DoubleClickForm2.Show()
    2. Form2.Label1.Text = lstTab.SelectedItem.ToString
    3. reader = cmd.ExecuteReader()
    4. Try
    5. Do While reader.Read()
    6. Form2.PictureBox1.ImageLocation = (reader.GetString(2))
    7. Loop
    8. Catch ex As Exception
    9. MessageBox.Show("FEHLER!", "FEHLER!", MessageBoxButtons.OK, MessageBoxIcon.Error)
    10. End Try
    11. End Sub



    PS: lstTab ist meine Listbox. Das mit Form2 kann man ignorieren ;)
    Edit: Sry das mit dem Quellcode hab ich iwi nicht hinbekommen ^^
    Tanke! :D :D :D
    Nein.. jetzt wirklich: DANKESCHÖN! :love:
    Spiggle0511

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

    Hallo,
    dein Fehler liegt schon beim Übergeben deiner Werte:
    lstTab.SelectedItem.ToString

    Hierbei musst du ihm schon sagen, welche Spalte du meinst. Also lstTab.SelectedItem(0).
    Manchmal hilft es auch, wenn du bei sowas den Wert in einer msgbox anzeigst.


    Gruß

    Ich habe es soweit schon hinbekommen, doch er zeigt nicht das Bild des ausgewählten Items an, sondern das Bild des letzten Eintrages.


    Ja richtig, der Code macht genau das was Du programmiert hast. ;)

    VB.NET-Quellcode

    1. Do While reader.Read()
    2. Form2.PictureBox1.ImageLocation = (reader.GetString(2))
    3. Loop


    Eben ALLE Datensätze durchlaufen und die jeweilige ImageLocation eintragen. Völlig klar das am Ende des Durchlaufes in der PictureBox nur das Bild des letzten Eintrages zu sehen ist.

    Du sollest halt nur die ImageLocation des Bildes übernehmen was Du auch in der ListBox ausgewählt hast. Dafür gibt es viele Möglichkeiten, wie z.B. das SQL-Statement das Du irgendwo dem Command-Object übergibst einfach mit einer WHERE-Klausel zu ergänzen damit mit ExecuteReader auch nur der gesuchte DS geladen wird. Oder Du prüfst beim Schleifendurchlauf ob die Datensatz-ID mit der ID die in der ListBox ausgewählt ist übereinstimmt und nur wenn die Bedingung True ist lädst Du den String als ImageLocation in die PictureBox.

    Gruß

    Rainer
    Was natürlich noch intelligenter wäre ist, dass du beim Click-Event eine Datenbankverbindung
    aufmachst mit den angeklickten Parametern.

    SELECT BildURL FROM AccesDB WHERE ID = 'angeklickte ID' (AND Name = 'angeklickter Name')

    Damit hast du auch nur das angeklickte Bild. Müsste auch schneller sein, wenn du auf ID nen "PrimaryKey"
    machst. Wenn du keinen PrimaryKey setzen kannst, dann benutz das in Klammern geschriebene oben dazu,
    dann indentifizierst du die direkt.
    Hmm - tätich sagn: Nein.

    IMO, wenn bereits eine Listbox existiert, aus der man was auswählen kann, dann folgere ich daraus, dass die Daten bereits da sind.
    Daher besteht ühaupt keine Notwendigkeit mehr, iwelche Daten (schon wieder!) abzufragen.

    Ist jetzt die Frage, wo der TE die Daten hingeladen hat. IMO gehören DB-Daten in ein typisiertes Dataset, wo jeder Datensatz als Datarow vollständig verfügbar bereitgestellt ist.
    Aber ich vermute, der TE hat gleich aus dem Reader iwelche einzelnen Spaltenwerte nach Listbox.Items geladen, und muß jetzt zusehen, wie aus dem SelectedItem den Dateipfad extrahiert (und wenn die Information nicht mehr erhalten ist ist halt schlecht).

    Nochn Hinweis:
    Ich habe eine Access Datenbank. In dieser habe ich als Spalten:...
    In einer Datenbank gibt es keine Spalten. Da sind Tabellen drin, und in den Tabellen gibts Spalten.
    Ist eminent wichtig, denn eiglich macht DB ühaupt nur Sinn, wenn mehrere Tabellen drin sind.

    Besteht deine DB nur aus einer einzigen Tabelle? Dann würdich von DB abraten, und die Tabelle in einfacherer Form abspeichern, gugge zB. DB-Programmierung ohne Datenbank (obwohl das sind auch schon 2 Tabellen - also deins wäre noch einfacher)

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

    ErfinderDesRades schrieb:

    Hmm - tätich sagn: Nein.

    IMO, wenn bereits eine Listbox existiert, aus der man was auswählen kann, dann folgere ich daraus, dass die Daten bereits da sind.
    Daher besteht ühaupt keine Notwendigkeit mehr, iwelche Daten (schon wieder!) abzufragen.
    Ich ging vom Reader aus und wollte dann den TE nicht mit einem DataSet noch zusätzlich stressen. ;)

    Empfehlen würde ich auch ein DataSet.
    Vielleicht hab ich das ja falsch verstanden, aber ich erklär das mal in meinen Worten:

    Datenbank mit 3 Spalten, URL,ID,Name.

    Die ID und der NAME werden in dieser Listbox eingetragen.
    Dann durch doppelklick soll das entsprechende Bild geöffnet werden.

    Die URL ist aber nirgends hinterlegt. Deswegen muss ich nochmal die
    Datenbank anstrengen um die URL zu bekommen.

    Wenn ich irgendwo einen Punkt nicht beachtet hab korrigier mich bitte.
    naja, ist doch deppert, nur Name und ID abzurufen, und die Url nicht.
    Oder schlimmernoch: Alles abrufen, aber nur Name + ID "aufbewahren", noch dazu nicht in einer Datenklasse, sondern in einem ListboxItem.
    Zeigt schön, dass man immer Gui und Daten trennen soll.
    Nämlich weil die Url nicht in der Listbox erscheinen soll, läßt man sie verfallen, und muß sie hinterher neu abrufen.

    Anstatt die daten in gscheite Datenklassen abzulegen, und Listbox dran zu binden.
    Beim Binden kann man einstellen, dass nur der Name angezeigt werden soll - weil die ID ist für den User ja auch ohne Belang. Trotzdem kann sowohl ID als auch Url genutzt werden, wenn die Listbox gebunden ist.
    Hallo!

    Danke für die vielen Antworten!

    @ErfinderDesRades das ist doch meine Sache wie ich das mache und wie oft ich die Datenbank abrufe, das ist im moment noch mein kleinstes Problem ;) Trotzdem danke!

    Ihr habt es mir alle ein bisschen kompliziert beschrieben, also ich hab es immer noch nicht ganz hinbekommen, aber das kann doch nur ein klitzekleines Problem sein.

    8|

    schoeler.k schrieb:


    Die URL ist aber nirgends hinterlegt. Deswegen muss ich nochmal die
    Datenbank anstrengen um die URL zu bekommen.

    Wenn ich irgendwo einen Punkt nicht beachtet hab korrigier mich bitte.


    Wie ErfinderDesRades schon sagte wäre das ein völliges NoGo.

    Man fragt die Daten ab die man braucht und wenn ich eine Listbox befülle um den User per Click eine URL öffnen zu lassen, dann brauche ich logischerweise auch die URL dazu und hole mir die nicht erst später mit einer neuen Datenbank-Abfrage.

    Ist bei lokalen Single-File-DB's vllt nicht ganz so offensichtlich wieso man das macht, aber spätestens wenn die DB auf einem externen Server liegt und der Verbindungsaufbau einige Sekunden in Anspruch nimmt wird ziemlich schnell ziemlich klar wieso man das so macht. ^^

    Gruß

    Rainer
    Hallo!
    Danke für die Antwort :)

    Nun, okay ich verstehe was du meinst. Also ich soll in der ersten Datenbankabfrage alle URLs speicher oder? Könnt ihr mir da einen kleinen Ansatz geben, wie das geht. Wie gesagt.. ich bin fortgeschrittener Anfänger :D

    Also ich kann meine Situation noch mal für alle erklären ^^
    Ich habe eine Datenbank (ich nenne sie jetzt mal "IDDatabase"). In dieser Datenbank habe ich eine Tabelle (!!! @ErfinderDesRades ;) ) und in dieser Tabelle habe ich die Spalten:
    ID (Primärschlüssel)
    Name
    Bild (Die URLs)

    Wenn ich nun das Programm öffne habe ich ein Textfeld, da gebe ich einen Teil eines Namens ein. Er sucht bei klick auf suchen alle namen die ähnlich wie der eingegebene Namen in der Textbox raus. Diese schreibt er mir dann in die Listbox in folgendem Format: ID - Name (bsp. 22 - Huber) Wenn ich nun einen doppelklick auf das 22 - Huber mache, öffnet sich ein Fenster.
    Das oben funktioniert alles wunderbar. Doch es soll dann folgendes passieren:
    In diesem steht nochmals die ID, der Name und ein Bild von der URL. Bei dem Bild wird aber die URL vom letzen Eintrag in der Listbox geschrieben.

    So, besser gehts nicht ^^
    Danke nochmals...

    Spiggle0511 schrieb:

    Wenn ich nun das Programm öffne habe ich ein Textfeld, da gebe ich einen Teil eines Namens ein. Er sucht bei klick auf suchen alle namen die ähnlich wie der eingegebene Namen in der Textbox raus. Diese schreibt er mir dann in die Listbox in folgendem Format: ID - Name (bsp. 22 - Huber) Wenn ich nun einen doppelklick auf das 22 - Huber mache, öffnet sich ein Fenster.
    Das oben funktioniert alles wunderbar. Doch es soll dann folgendes passieren:
    In diesem steht nochmals die ID, der Name und ein Bild von der URL. Bei dem Bild wird aber die URL vom letzen Eintrag in der Listbox geschrieben.

    Guck dirmal DBEinzelblattView auf Movie-Tuts an.
    Da aktualisieren sich die EinzelControls nicht erst beim Doppelklick auf einen Datensatz, sondern gleich, sobald der Datensatz angewählt ist. Das geht mit Databinding. Ebenso könnte man die url-Property deiner Datensätze an die Picturebox.ImageLocation-Property binden und fertig.