none
BindingSource auf einzelne DataRow RRS feed

  • Frage

  • Hallo,

    ich möchte Textboxen eines Formulars mit den Spalten einer mit .NewRow() aus einer DataTable neuerstellten DataRow binden und stehe da grad auf dem Schlauch.

    Egal ob ich meine Textboxen mit DataBinding.Add(New Binding(...)) direkt mit der DataRow binden will oder über eine DataSource, ich bekomme in beiden Fällen einen Fehler. Aber es müsste doch gehen, oder? Aber wie? Die zugrunde liegende Tabelle lässt sich problemlos binden.

    Gruß,

    WiWo

    Dienstag, 9. Oktober 2012 14:36

Antworten

  • Hallo,

    damit es passt, brauchst Du eine Auflistung, denn die BindingSource erwartet einen CurrencyManager und der wiederum verwaltet nur Listen - im Gegensatz zum PropertyManager, der für einzelne Elemente gedacht ist - hier aber nicht taugt - und beide stammen von BindingManagerBase ab.

    Und auch wenn es hier nur ein (neuer) Satz ist, so musst Du eine DataView verwenden,
    die auf eine Zeile gefiltert wird. Für neu ginge theoretisch eine leere DataView (über einen "Null-Filter"), aber dann würde die Zeile beim ersten Speichern verschwinden.

    Wenn Du mit mehreren Formularen arbeiten willst, so ist es besser, zuerst den Datensatz zu speichern und im Fehlerfalle wieder zu löschen. Da sich das DataSet nur im Speicher befindet, passiert nichts wirklich, solange Du nicht die Datenbank-Speicherung anstößt.

    Gruß Elmar

    • Als Antwort markiert WiWo Mittwoch, 10. Oktober 2012 18:27
    Dienstag, 9. Oktober 2012 19:02
    Beantworter

Alle Antworten

  • Welcher Fehler wird denn angezeigt? Typischerweise für einfache Listen geht das so:
     
    TextBox1.DataBindings.Add(“Text”, myBindingSource, “eigenschaftsname”)
     
    --
    Viele Gruesse
    Peter
    Dienstag, 9. Oktober 2012 14:48
  • Hallo,

    binden tust Du immer an eine DataView (im Zweifelsfall DataTable.DefaultView).

    Beachte, dass jede DataView jeweils eine "neue" Zeile verwaltet, so dass man sie nicht über mehrere Datenquellen (oder Formulare) hinweg durchreichen sollte. Denn dann gibt es Probleme, wenn das Bearbeiten abgebrochen werden soll.

    Ob für bestehende oder nur für eine neue Zeile bleibt sich das Binden gleich. Wenn Du Zeile bereits angelegt hast, stelle die Filter-Eigenschaft der BindingSource auf den Primärschlüssel der neuen Zeile ein. Ansonsten positioniere direkt auf eine neue Zeile z. B. via BindingSource.AddNew.

    Gruß Elmar
    Dienstag, 9. Oktober 2012 15:11
    Beantworter
  • Erstmal Danke für die Antworten.

    @Peter: Die Fehlermeldung (zur Laufzeit) ist irgenwas in der Richtung "Datenquelle kann nicht an das Objekt gebunden werden", wobei übrigens kein Fehler entsteht durch die Bindung der DataRow an die BindingSource sondern erst beim Binden der BindingSource an die TextBox. Von der msdn-Doku her kann ich nicht erkennen, welche Objekttypen als Bindingsource erlaubt sind, aber da z.B. DataRow.Current bei Bindung an eine Tabelle ein DataRowView-Objekt liefert, von dem die DataRow selbst nur wieder ein Element ist, gehts wohl nicht so einfach, wie ich dachte.

    Vielleicht schildere ich lieber mal das Gesamt-Szenario:

    Die Applikation läuft auf einem Mobil-Terminal, weshalb ich Design-mäßig etwas eingeschränkt bin. Ein Lieferschein (oder Rechnung) soll erstellt werden. Der Kunde ist angewählt, jetzt werden die Artikel aus einer Tabelle ausgewählt (z.B. per Barcode-Scan). Zu jedem Artikel geht ein Fenster auf, in dem der Verkäufer die Artikeldaten sieht und Stückzahl (und ein paar andere Werte) setzen kann. Es gibt die Möglichkeit, abzubrechen, ohne zu speichern (z.B. ein falscher Artikel wurde gescant). Das selbe Formualr soll auch zum Ändern bereits gespeicherter Positionen verwendet werden. Deshalb wollte ich je nach Aufruf (Neu oder Edit) an eine neue DataRow binden oder an die zu editierende. Naturlich könnte ich das alles auch manuell ohne Datenbindung lösen, aber mit Datenbindung ist's doch eleganter. Nun, da ich wohl einsehen muss, dass eine Bindung an eine DataRow selbst nicht geht, wie mache ich es sonst? Also wahlweise einen ungespeicherten (aber vorbelegten) Datensatz editieren oder einen in DataSet/ DataTable gespeicherten. Oder soll ich vor dem Edit erstmal speichern und bei Abbruch wieder löschen?

    Gruß,

    WiWo

    Dienstag, 9. Oktober 2012 18:30
  • Hallo,

    damit es passt, brauchst Du eine Auflistung, denn die BindingSource erwartet einen CurrencyManager und der wiederum verwaltet nur Listen - im Gegensatz zum PropertyManager, der für einzelne Elemente gedacht ist - hier aber nicht taugt - und beide stammen von BindingManagerBase ab.

    Und auch wenn es hier nur ein (neuer) Satz ist, so musst Du eine DataView verwenden,
    die auf eine Zeile gefiltert wird. Für neu ginge theoretisch eine leere DataView (über einen "Null-Filter"), aber dann würde die Zeile beim ersten Speichern verschwinden.

    Wenn Du mit mehreren Formularen arbeiten willst, so ist es besser, zuerst den Datensatz zu speichern und im Fehlerfalle wieder zu löschen. Da sich das DataSet nur im Speicher befindet, passiert nichts wirklich, solange Du nicht die Datenbank-Speicherung anstößt.

    Gruß Elmar

    • Als Antwort markiert WiWo Mittwoch, 10. Oktober 2012 18:27
    Dienstag, 9. Oktober 2012 19:02
    Beantworter
  • Hallo Elmar,

    ich denke, so wie Du vorgeschlagen hast, werd ich's wohl auch machen.

    Da ich als mein erstes größeres VS-Projekt eine Mobil-Applikation zu schreiben habe, macht die trial & error Zyklen leider etwas länger; im nächsten Leben mach ich's anders..

    Gruß,

    WiWo

    Mittwoch, 10. Oktober 2012 18:32