Einfaches Dataset über 2 Formen steuern

  • VB.NET
  • .NET (FX) 4.0

Es gibt 33 Antworten in diesem Thema. Der letzte Beitrag () ist von Snipy26.

    Ok, jetzt reicht's, ich offenbare es Dir.

    2 Punkte:

    1. Du bindest die PicBox-Image-Property an die Icon-Spalte der DataTable vom Typ Object. Klingt erstmal vernünftig, funktioniert aber nicht. Weil dann das Image in der DataTable drinsteht und ein Image nicht in ne XML geschrieben werden kann. Siehe Fehlermeldung in Post#9: System.InvalidOperationException: "Type 'System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' does not implement IXmlSerializable interface therefore can not proceed with serialization."

    2. GamesBindingSource.AddNew soll überhaupt nicht verwendet werden. Ich wage zu behaupten, dass @ErfinderDesRades das auch - falls überhaupt - nur kurz in seinen Videos zeigt, bevor er zeigt, wie es richtig geht, nämlich mit DeinTds.DeineDataTable.AddDeineDataTableRow(HierAlleParameter). So fügt man Daten sinnvoll dem tDS hinzu. Da braucht man auch keinen BindingNavigator und das Ganze geht schon beim ersten Mal. Also:

    VB.NET-Quellcode

    1. 'bisher und falsch:
    2. 'Me.GamesBindingSource.AddNew()
    3. 'Me.GameDataSet1.WriteXml(_dataSource)
    4. 'Me.GamesBindingSource.EndEdit()
    5. 'nur so machen:
    6. Me.GamesBindingSource.EndEdit()
    7. GameDataSet1.games.AddgamesRow(Nothing, TextBox1.Text, TextBox2.Text) '1. Parameter = Icon = Nothing, weil: siehe unten
    8. Me.GameDataSet1.WriteXml(_dataSource)


    Und nun zum Icon: Deklariere Icon nicht als Object, sondern als Byte() und benenne dann sinnvollerweise das in IconData um. Danach kannste Dir mal im Netz raussuchen, wie Du aus einer Bilddatei ein Byte-Array machst, damit Du das auch in ner XML per WriteXML abspeichern kannst.
    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.
    Danke für deine offenen Worte und deiner Offenbarung. Werde dies denn mal umsetzen. Du hast mir ja auch schon in vielen anderen Bereichen ja gezeigt, wie es richtig geht. Und werde auch dies hier umsetzen. Vielen lieben Dank. Wenn was ist, frage ich wieder.

    Und jetzt wo du es sagst, ist es ja auch klar, das ein Icon nicht als Bild in eine .xml geschrieben werden kann. In der .xml steht ja auch nur Text drin.

    Das hat EDR ja auch nicht gemacht, mit dem AddItem. Da bin ich durch Zufall wo anders drauf gestoßen, und da es ja irgendwie gefunzt hat, dachte ich, ok, passt. Aber man kann nur aus Fehlern lernen und es besser machen. Und man kann nur lernen, wenn man einen guten Mentor hat, und nicht nur zeigt, wie es richtig sein muss, sondern das auch erklärt, warum. Und das machst du. Echt top von dir. Danke nochmals :thumbup:

    PS:
    Eine vllt für dich doofe Frage. Beim Delete müsste ich ja denn auch so verfahren oder?

    VB.NET-Quellcode

    1. GameDataSet1.games.RemovegamesRow(Nothing, TextBox1.Text, TextBox2.Text) '1. Parameter = Icon = Nothing,


    Oder kann ich da meinen so drin lassen? :whistling:


    Edit: Habe es gemacht. Daten werden auch geschrieben, aber wenn ich ein weiteres hinzufügen will, überschreibt er das alte und macht es als doppelten Eintrag. Und die TextBoxen leeren sich nicht. Daher war ja mein Ursprungsgedanke das mit dem AddNewItem. ?(
    Grüße Snipy26



    Auf jeder Aktion erfolgt immer eine Re-Aktion, und selbst wenn es nur ne Fehlermeldung ist. :thumbsup:

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Snipy26“ ()

    Das Entfernen mit GamesBindingSource.RemoveCurrent ist ok, das kann bleiben.
    Das mit dem Add: Nachdem die Daten hinzugefügt wurden, müssen die TextBoxen geleert werden, sonst werden deren Inahlte natürlich wieder für das nächste Item hergenommen. Bedenke den Code:
    GameDataSet1.games.AddgamesRow(Nothing, TextBox1.Text, TextBox2.Text) '1. Parameter = Icon = Nothing, weil: siehe untenEs wird eine neue Zeile hinzugefügt und es werden die Daten verwendet, die aktuell in den TextBoxen drinstehen.
    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.
    Habe den Inhalt rausgelöscht und dann neu eingetragen. Jedoch hat er das alte überschrieben und davon einen zweiten Eintrag gemacht.

    Habe auch folgenden Code versucht. Aber ohne Erfolg. Er überschreibt immer den zuletzt eingetragenen Eintrag. ?(

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub BtnAddGame_Click(sender As Object, e As EventArgs) Handles BtnAddGame.Click
    2. 'Add Game - Button
    3. Dim text As String = ""
    4. Dim caption As String = "Game Manager"
    5. If TextBox1.Text = Nothing And TextBox2.Text = Nothing Then
    6. MessageBox.Show("Bitte Name des Spieles eintragen oder Pfad angeben", caption, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    7. ElseIf TextBox1.Text = Nothing Then
    8. MessageBox.Show("Bitte Name des Spiels eingeben", caption, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    9. ElseIf TextBox2.Text = Nothing Then
    10. MessageBox.Show("Bitte Pfad auswählen", caption, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    11. Else
    12. 'In DB die Daten hinzufügen
    13. Me.GamesBindingSource.EndEdit()
    14. GameDataSet1.games.AddgamesRow(Nothing, TextBox1.Text, TextBox2.Text) '1. Parameter = Icon = Nothing,
    15. Me.GameDataSet1.WriteXml(_dataSource)
    16. TextBox1.Clear()
    17. TextBox2.Clear()
    18. End If
    19. End Sub


    Das mit '1. Parameter = Icon = Nothing, habe ich für mich als Hinweis drin gelassen.
    Grüße Snipy26



    Auf jeder Aktion erfolgt immer eine Re-Aktion, und selbst wenn es nur ne Fehlermeldung ist. :thumbsup:
    Mein Fehler. Das liegt daran, dass die TextBoxen und die PicBox noch an die DataTable gebunden sind. Nimm das Binding raus, dann klappt es auch.
    Binding ist wichtig zum Anzeigen und Bearbeiten der Daten. Aber zum Hinzufügen wird's etwas doof, weil Du erstmal keinen Eintrag hast. Und wie willst Du an einem Nichteintrag was ändern?
    Alternativ kannst Du zu Programmstart mit Me.GamesBindingSource.AddNew() arbeiten, um einen leeren Eintrag der DataTable hinzuzufügen. Diesen kannst Du dann mithilfe der TextBoxen bearbeiten. Und sobald Du auf [Add Game] klickst und eben nicht mit meinem vorgeschlagenen GameDataSet1.games.AddgamesRow, sondern mit Me.GamesBindingSource.AddNew() wieder arbeitest, wird eben ein 2. Eintrag (wieder leer) hinzugefügt.
    Es sind eben andere Abläufe. Leeren Eintrag hinzufügen und diesen dann bearbeiten oder Daten eintragen und daraus einen fertigen Eintrag machen.
    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.
    Also mit den Bindings entfernen hat jetzt geklappt. Musste nur beim Formstart es anders machen.

    Statt wie du vorgeschlagen hast mit folgendem ->

    VB.NET-Quellcode

    1. Dim _dataSource = DirectCast(GamesBindingSource.Current, DataRowView)


    Habe ich es jetzt so gemacht.

    VB.NET-Quellcode

    1. If IO.File.Exists(_dataSource) Then
    2. Me.GameDataSet1.ReadXml(_dataSource)
    3. End If


    Auch wenn es untypisch erscheint. Aber die Daten werden korrekt und richtig im Hauptprogramm geladen. Die ComboBox übernimmt die Daten auch richtig. Habe eine weitere Form mit aufgenommen, wo ein DataGridView arbeitet. Quasi als Gesamt Übersicht. Und da stehen die Daten auch korrekt drin. Bis jetzt läuft es perfekt. Zumindest im Debug Modus. :D
    Jetzt nur noch das mit den Icons, was du geschrieben hast, und denn wäre es fast fertig. Bis auf 2-3 Kleinigkeiten.
    Grüße Snipy26



    Auf jeder Aktion erfolgt immer eine Re-Aktion, und selbst wenn es nur ne Fehlermeldung ist. :thumbsup:

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

    Mal noch ne Frage. Ich möchte gerne eine Deklaration erstellen, die auf mein Dataset -> DataTable -> Member bzw ID zugreift.

    VB.NET-Quellcode

    1. ​Dim _path As String = GameBindingSource.???
    2. ComboxBox1.Text = Prozess.Start(_path)


    Ziel ist folgendes. In der Combobox wird der Name angezeigt, und bei Auswahl soll halt der Pfad / ID sein, um das Spiel zu starten.
    Nur weiß ich nicht genau, wie ich das am besten deklarieren soll. Als String erscheint mir sinnvoll.
    Grüße Snipy26



    Auf jeder Aktion erfolgt immer eine Re-Aktion, und selbst wenn es nur ne Fehlermeldung ist. :thumbsup:
    Such mal im Forum nach Doppelcast. Davon ausgehend, dass diese GamesBindingSource mit einer DataTable namens games verknüpft ist: Im Current der BindingSource steckt ein DataRowView drin. Dieses DataRowView hat eine Row und diese kannst Du typisiert in Deine DataTableRow casten.
    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.

    Snipy26 schrieb:

    die auf mein Dataset -> DataTable -> Member bzw ID zugreift.
    Das ist ein bischen unspezifisch.
    Welche DataTable?
    Welche Datarow aus dieser DataTable?
    Welchen Member?

    Dein Code-Snippet - was soll sowas?

    VB.NET-Quellcode

    1. ComboxBox1.Text = Prozess.Start(_path)
    So einen Unfug hab ich seit Wochen nicht mehr gesehen.
    Bilder sagen mehr als 1000 Worte ;)

    Daher mal die Bilder. Falls weitere Infos benötig werden, Bescheid geben

    Zum Code. ComboxBox1.Text = Prozess.Start(_path). Habe mich verschrieben. meinte eigentlich den hier ComboBox1.SelectedItem = Process.Start(_path). Hab da eben nicht ganz aufgepasst. Sry.

    Edit: Sry @VaporiZed. Habe eben erst dein Post gesehen. Bin dabei.
    Bilder
    • DataSet.jpg

      42,9 kB, 822×555, 21 mal angesehen
    • ComboBox.jpg

      22,98 kB, 327×258, 22 mal angesehen
    Grüße Snipy26



    Auf jeder Aktion erfolgt immer eine Re-Aktion, und selbst wenn es nur ne Fehlermeldung ist. :thumbsup:

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

    Leider ist ComboBox1.SelectedItem = Process.Start(_path) fast ebenso ein Quatsch.
    Was soll die Zeile eigentlich bewirken?

    Aber immerhin meine Fragen nach DataTable und Member sind beantwortet.
    Helfen kann ich dennoch nicht, weil ich keine Ahnung habe, eiglich gewünscht ist, was passieren soll.

    Ah - vielleicht möchtest du das Programm ausführen, was in der Combobox angewählt ist. Das könnte so gehen:

    VB.NET-Quellcode

    1. dim rwGames=DirectCast(DirectCast(GameBindingSource.Current, DataRowView).Row, gamesRow)
    2. dim pth = rwGames.Name 'eine Variable besser nicht 'Path' nennen, denn so heisst schon eine sehr wichtige Klasse in System.IO
    3. Prozess.Start(pth)
    vorrausgesetzt, in ".Name" ist der vollständige Pfad einer ausführbaren Datei enthalten.

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

    Genau. Über die ComboBox wähle ich das Spiel aus, und in der DB ist der vollständige Pfad drin, und denn kann ich dadrüber den "Pfad" starten.
    Ok, werde es gleich ändern mit _path in pth ändern, das habe ich nicht bedacht.

    Das mit dem DirectCast(DirectCast(GameBindingSource.Current, DataRowView).Row, gamesRow) hab ich in den post Drucken des Inhalts eines Datagridview / Dataset über mehrere Seiten in VB Net gefunden. Nur danach habe ich noch festgehangen. Danke euch beiden :)vb-paradise.de/index.php/Threa…ostID=1103911#post1103911

    Habe es mal so gemacht. Fehler -> Konnte den angegeben Pfad nicht finden.

    Anbei mal Bilder von den Listen und hier mal der code:

    VB.NET-Quellcode

    1. Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
    2. 'Start - Button
    3. Dim text As String = ""
    4. Dim caption As String = "Game Manager"
    5. Dim rwGames = DirectCast(DirectCast(GamesBindingSource.Current, DataRowView).Row, GameDataSet.gamesRow)
    6. Dim pth = rwGames.Name
    7. If ComboBox1.Text = Nothing Then
    8. MessageBox.Show("Bitte ein Spiel wählen!", caption, MessageBoxButtons.OK, MessageBoxIcon.Information)
    9. Else
    10. 'ComboBox1.SelectedItem =
    11. Process.Start(pth)
    12. End If
    13. End Sub
    Bilder
    • ComboListe.jpg

      8,94 kB, 296×96, 17 mal angesehen
    • Übersicht.jpg

      45,09 kB, 695×399, 17 mal angesehen
    Grüße Snipy26



    Auf jeder Aktion erfolgt immer eine Re-Aktion, und selbst wenn es nur ne Fehlermeldung ist. :thumbsup:

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

    Snipy26 schrieb:

    pth
    Mach es Dir selbst nicht zu kryptisch. Ich würde an der Stelle GameFilePath schreiben. Ungewöhnliche Abkürzungen strengen beim Lesen insofern an, weil man über die Bedeutung quasi jedes Mal nachdenken muss.
    Dann eben ich. Beantworte bitte folgende Doppelfrage: ComboBox1.SelectedItem = Process.Start(_path) ergibt keinen Sinn. Denn eine Variable welchen Typs gibt jener Process.Start-Aufruf zurück und was hat jener Typ in der ComboBox zu suchen?
    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.
    Hatte das mal von früher, wo ich mit einer Liste die Daten geladen hatte.Da hatte ich noch ne txtliste gehabt. Überbleibsel aus alter Zeit. Habe es schon Auskommentiert. Steht jetzt nur als Hinweis für mich drin.
    Ok, bissel Übersicht mit Namen schadet nie. Habe auch alle Formen von z.B. Form1 in frmMain umbenannt. Oder mit den Button, was Ihr vorgeschlagen habt. Ist leichter zu finden.

    Edit: Fehler gefunden. ​Dim pth = rwGames.Name Da war der Fehler. Habe es auf ​Dim pth = rwGames.Path geändert, und nur startet er das so wie er soll. Danke euch. :thumbsup:
    Grüße Snipy26



    Auf jeder Aktion erfolgt immer eine Re-Aktion, und selbst wenn es nur ne Fehlermeldung ist. :thumbsup:

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