Listbox und DataSet

  • VB.NET
  • .NET (FX) 4.0

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    Listbox und DataSet

    Hallo nochmal,

    Ich versuche gerade eine kleine Editierbare Liste zusammenzufassen welche sich mit Hilfe von Zwei Buttons bedienen lässt.

    Ich habe also eine Listbox und einen Button zum Hinzufügen und Entfernen. In der DataTable (DataTableFavourites) sind 3 Spalten enthalten: URL,App & Songname.

    Ebenfalls habe ich ein Event zum Laden der Einstellungen:

    VB.NET-Quellcode

    1. Private Sub Favourites_Enter(sender As Object, e As EventArgs) Handles Favourites.Enter
    2. End Sub


    Nun soll es so sein, dass wenn man die Tabpage Favourites aufruft, durch das Event sämtlicher Inhalt der DataTable in die Listbox geladen wird Das sieht dann als Vollständiger Eintrag in der Listbox so aus:
    Beispiel: Sing! Karaoke - Say Something - smule.com/p/125820910_74092872

    Beim hinzufügen Button möchte ich halt werte in die 3 Spalten eintragen und gleichzeitig zur Listbox hinzufügen.
    Beim löschen Button, soll der Selected Eintrag aus der Tabelle entfernt werden.

    Doch wie kann ich das realisieren? Ich habe bereits alle passenden Events doch leider keine Ahnung von DataSet benutzung.


    Liebe Grüße
    Mir ist zwar nicht ganz klar, was du eigentlich vor hast und das im verwiesenen Beispiel sagt eigentlich auch nichts...
    Aber wenn du schon ein typ. Dataset mit einer Tabelle Favourites erstellt hast, dann nehme ein DGV zur Datenbearbeitung und binde es an die Tabelle...
    Lies dir einmal diese TUT durch und schaue dir die angebotenen Filme an...

    VB1963 schrieb:

    Mir ist zwar nicht ganz klar, was du eigentlich vor hast und das im verwiesenen Beispiel sagt eigentlich auch nichts...


    Ich versuche es nocheinmal besser zuerklären. Ich suche einen Weg um eine ListBox gezielt mit Inhalt zu füllen. Es soll möglich sein Inhalt hinzuzufügen, zu löschen und bei dem Favourite Event soll der Inhalt geladen werden. Ich wollte das ganze mit einer DataTable regeln damit ich mir nicht extra noch die benötigte URL rausfiltern muss.

    Mein Problem jetzt jedoch ist das ich nicht weis wie ich die Spalten der DataTable mit Inhalt füllen kann und diesen dann abzuspeichern.
    Das selbe gilt sowohl fürs löschen und laden der Inhalte in die ListBox.

    Ebenfalls habe ich noch eine Frage: Angenommen ich müsste in Zukunft irgendwas an der Tabelle ändern und stelle dann ein Update zur verfügung, können dann jedoch die alten Daten ohne Probleme geladen werden? Und wie schaut es aus wenn man den gesammten Ordner austauscht für ein Update? Sprich das neue runterladen und die alten Dateien ersetzt, wird dann automatisch die DataTable mit geleert? Wenn ja wie lässt sich das verhindern?

    Liebe Grüße
    Keine Listbox sondern DGV...
    Mein Problem jetzt jedoch ist das ich nicht weis wie ich die Spalten der DataTable mit Inhalt füllen kann und diesen dann abzuspeichern.
    Füge deinem Projekt ein typ. Dataset hinzu Projektmappenexplorer/DeinProjekt/Hinzufügen/Neues Element...
    Im aufgerufenen Dialog wählst du dann Daten/Dataset.xsd aus und vergibst einen ordentlichen Namen für das neue Dataset.
    Aus dem Werkzeugkasten kannst du dir dann eine leere Tabelle ins leere Dataset hineinschieben.
    Nachher fügst du dieser Tabelle deine gewünschten Spalten hinzu und vergibst denen jeweils einen ordentlichen Namen und einen Datentyp.
    Schaue danach einmal ins Datenquellenfenster Umschalt+Alt+D - da wirst du dann dein erstelltes typ. Dataset finden.
    Dort wählst du dann deine Tabelle aus und ziehst sie dir in eine leere Form...
    Du dich wundern, was sich da alles neben dem DGV in der Form noch alles im darunterliegenden Komponentenfach mit generiert hat (Dataset, Bindingsource und Bindingnavigator).
    Das generierte DGV kannst du via Editor an deine Bedürfnisse weiter anpassen...
    Du könntest jetzt im datengebunden DGV bereits Daten eingeben, editieren, sortieren und löschen.
    Das Laden und Speichern des ganzen Datasets(kann auch mehrere Tabellen enthalten) kannst du über die Methoden per Code
    DeinDataset.ReadXml(DeineDatendatei)
    DeinDataset.WriteXml(DeineDatendatei)
    erledigen. Damit hast du bereits eine kleine Datenbank erzeugt.
    Wenn du das hast - können wir über Löschen und Anfügen von Daten per Code noch sprechen...
    Lese dir das Tutorial einmal genau durch!
    Ja, soweit war ich auch schonmal, jedoch als ich dann bei dem DGV/ListBox die Quelle auf meine DataTable angegeben habe bekam ich immer 2 Fehler:
    DataSet Fehler

    Außerdem möchte ich die Werte ja nicht als Tabelle ausgeben sondern einfach nur als eine Liste. Von Oben nach unten Alphabetisch nach Songname sortiert.
    Hmm hier einmal der bisherige fortschritt, die XML Datei wird zwar erstellt jedoch ohne Inhalt, sprich Speichern und laden klappt nicht ganz.

    Doch wie geht es jetzt weiter?

    LG



    EDIT:// Habe es bereits einspaltig und Laden und Speichern geht auch, doch wie lasse ich zuerst die Werte aus den Textboxen ins DataGrid hinzufügen? Es sollen nämlich keine USER Eingaben passieren, das hinzufügen passiert automatisch später.


    EDIT2:// Rows lassen sich nicht beim Button Click hinzufügen, Fehler:
    Eine nicht behandelte Ausnahme des Typs "System.InvalidOperationException" ist in System.Windows.Forms.dll aufgetreten.

    Zusätzliche Informationen: Zeilen können nicht automatisch zur Zeilenauflistung der DataGridView hinzugefügt werden, wenn das Steuerelement datengebunden ist.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Me.DataSetFavourites.ReadXml("favourite.xml")
    4. End Sub
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. Me.DataGridView1.Rows.Add()
    7. Me.DataGridView1.Rows(Me.DataGridView1.Rows.Count + 1).Cells("Songname").Value = TextBox1.Text
    8. Me.DataGridView1.Rows(Me.DataGridView1.Rows.Count - 1).Cells("URL").Value = TextBox2.Text
    9. Me.DataGridView1.Rows(Me.DataGridView1.Rows.Count - 1).Cells("App").Value = ComboBox1.Text
    10. Me.DataSetFavourites.WriteXml("favourite.xml") ' Hier müssen die Textboxen in das XML File geschrieben werden, nicht der Inhalt aus dem DGV
    11. End Sub
    12. End Class

    LG

    Dateien
    • favourite.zip

      (132,06 kB, 174 mal heruntergeladen, zuletzt: )

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

    lasse die 1 von deinem Dataset weg, dann funktioniert das laden und speichern...

    VB.NET-Quellcode

    1. Me.DataSetFavourites.ReadXml(_xmlPath)

    Merke dir: Trenne die Daten von der GUI
    Das DGV gehört nur zur Visualisierung und Datenbedienung.
    Wenn du nur das DGV als Datenanzeige verwenden willst, dann stelle erst einmal Hinzufügen, Löschen und Editieren auf False.
    Das machst du am besten über das Aufgabenmenü (kleines weißes Kästchen rechts oben beim DGV-Control)
    Suche im Objektkatalog nach folgenden typ. Methoden, die mit der Erstellung des Datasets mit generiert wurden:
    AddDataTableFavouritesRow(...)
    NewDataTableFavouritesRow(...)
    schaue sie dir einmal dort an.
    Diese Methoden verwendest du dann zum Hinzufügen von Datensätzen...


    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VB1963“ ()

    Wie kann ich die Methoden denn im Code aufrufen?

    Oder meinst du das anders? Ich habe Sie zwar im Objektkatalog gefunden jedoch weiß ich nicht wie ich diese beim Button Event ausführen kann.

    LG
    Me.DataSetFavourites.DataTableFavourites....
    guck dir auch einmal die Überladungen der einzelnen Methoden im Objectbrowser an und welche Datentypen verlangt werden...
    z.b:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. With Me.DataSetFavourites.DataTableFavourites
    3. Dim rw = .NewDataTableFavouritesRow()
    4. rw.Songname = "Songname"
    5. rw.URL = "url"
    6. rw.App = "App"
    7. .AddDataTableFavouritesRow(rw)
    8. 'oder kürzer und gleich so
    9. .AddDataTableFavouritesRow("Songname1", "url1", "App1")
    10. End With
    11. End Sub

    Und noch etwas: Die ID-Spalte blendest du im DGV aus - die ist tabu...

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

    Vielen dank für deine Hilfe, ich weis das wirklich sehr zu schätzen!

    Jetzt sieht es so aus:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Me.DataSetFavourites.ReadXml("favourite.xml")
    4. End Sub
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. Me.DataSetFavourites.DataTableFavourites.AddDataTableFavouritesRow(TextBox1.Text, TextBox2.Text, ComboBox1.Text)
    7. Me.DataSetFavourites.WriteXml("favourite.xml") ' Hier müssen die Textboxen in das XML File geschrieben werden, nicht der Inhalt aus dem DGV
    8. End Sub
    9. End Class


    Problem jetzt jedoch ist das die hinzugefügten Werte nicht in der XML gespeichert werden.

    Hmm ?(
    Hast du denn irgendetwas anders gemacht als ich? Die XML bleibt leer und beim Load Event bleibt das DataGridView auch leer.

    LG
    Ich beschreibe die Zellen direkt mit Strings und du übernimmst Text von den anderen Controls. Steht da überhaupt etwas drinnen?
    Da kommen wir nämlich zu einem anderen Kapitel Databinding

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

    Ja in den Controls steht was drin. Ich habe mal in das Tutorial geschaut und meinen Fehler gefunden:

    VB.NET-Quellcode

    1. Private _Datafile As New FileInfo("FavouriteData.xml")
    2. Me.DataSetFavourites.WriteXml(_Datafile.FullName) ' Hier müssen die Textboxen in das XML File geschrieben werden, nicht der Inhalt aus dem DGV


    So klappt es. Nun werden noch zwei Sachen benötigt, Wenn ein Element in einer Reihe angeklickt wird, muss die ganze Reihe selected werden. und mit dem Button Löschen muss die ganze Reihe Entfernt werden.
    Ich schau mal ob ich das logisch zusammenstellen kann.


    EDIT://
    So ich habe mal ein wenig rumprobiert und mir tun sich folgende Probleme auf:

    wenn ich irgendein Element in einer Row anklicke der Wert aus der URL cell in eine Textbox übertragen werden.

    Beim löschen habe ich zwar den richtigen Ansatz gefunden, jedoch weiß ich nicht wie ich die passende Row zuordne hier mal mein Ansatz:

    VB.NET-Quellcode

    1. Me.DataSetFavourites.DataTableFavourites.RemoveDataTableFavouritesRow(DataGridView1.Rows.GetRowCount(DataGridViewElementStates.Selected))


    LG


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

    Zum Löschen eines Datensatzes schaue dir die Bindingsource-Klasse einmal an, dort gibt es Methoden, die du da brauchen kannst BindingSource.???()

    Wenn du Daten einer Zelle von der ausgewählten Zeile eines DGV in eine TextBox übertragen möchtest (Detailview),
    dann braucht man nur die TextBox daran richtig binden (siehe Bildchen)...
    Die TextBox anwählen und im Eigenschaftenfenster bei (Databindings) die Text-Eigenschaft auswählen und rechts die gleiche Bindingsource wie beim DGV hernehmen
    und dann den gewünschten Datamember(bei dir URL) auswählen - fertig...
    Bilder
    • Databindings.PNG

      9,68 kB, 528×253, 152 mal angesehen

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

    Ansich keine schlechte Lösung jedoch folgt ein Problem daraus. Das sorgt dazu das die URL permanent ersetzt wird, das soll sie aber nicht nur einmal wenn etwas ausgewählt wird.

    Deswegen muss ichd as per Event lösen ohne Option STrict On geht es auch ganz einfach, mit weis ich nicht wie ich es hinbekomme.
    Hier einmal mein Lösungsansatz:

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick
    2. TextBox2.Text = DataTableFavouritesBindingSource.Current("URL")
    3. End Sub


    Kurze Frage, aus irgendeinem Grund bekomme ich permanent einen Fehler im Designer (Siehe Thread der früher genannt wurde)
    Dieser verschwindet zwar wenn ich es zu:

    VB.NET-Quellcode

    1. Me.DataSetFavourites = New Global.Sownloader.DataSetFavourites()

    Änder taucht jedoch immer wieder auf wenn ich irgendwas mit DataSets umstelle, im Testprojekt hatte ich das nicht, kann man das irgendwie fixen?
    ohne Option Strict On geht es auch ganz einfach
    lass es lieber auf On und behebe die Fehler!
    Databindings:
    Wenn du in der TextBox Änderungen machst, werden sie sofort im DGV übernommen und angezeigt.
    Du willst ja im DGV nichts ändern? Sonst verstehe ich da deine Anforderung nicht...
    Nun das DGV erhält die Werte nicht aus der Textbox. Sondern soll für den User gewählte Werte speichern und dann per Klick einfügen, jedoch soll die Textbox immer weiter verwendet werden können.
    Deswegen möchte ich das mit dem CellClick Event lösen und dann einmal den Text der Textbox austauschen doch wie geht es ohne Option strict on zu deaktiveren?

    Aber warum bekomme ich jedesmal diesen Fehler hier:
    Fehler 1 Der Typ "Sownloader.DataSetFavourites" ist nicht definiert. c:\users\marvin\documents\visual studio 2012\Projects\Sownloader\Sownloader\Sownloader.Designer.vb 102 36 Sownloader

    Fehler 2 Der Typ "Sownloader.DataSetFavourites" ist nicht definiert. c:\users\marvin\documents\visual studio 2012\Projects\Sownloader\Sownloader\Sownloader.Designer.vb 1024 44 Sownloader



    Im Designer:

    VB.NET-Quellcode

    1. Me.DataSetFavourites = New Sownloader.DataSetFavourites()
    2. Friend WithEvents DataSetFavourites As Sownloader.DataSetFavourites


    Der nervt mich extremst.
    Gut, dann musst du die Databindings der Controls wieder rückgängig machen...
    Dann holst du dir über einen 2 fachen DirectCast die aktuell angewählte DataTableFavouritesRow und aus dieser deine jeweiligen Daten für deine TextBoxen.

    VB.NET-Quellcode

    1. Dim drv = DirectCast(DataTableFavouritesBindingSource.Current, DataRowView)
    2. Dim rw = DirectCast(drv.Row, DataTableFavouritesRow)
    3. Me.Textbox1.Text = rw.URL
    4. ' usw.

    Was deinen Fehler betrifft - keine Ahnung...