interaktion mehrerer DataTables / zeigen von offenen Kundenbestellungen

  • VB.NET

Es gibt 36 Antworten in diesem Thema. Der letzte Beitrag () ist von DerSmurf.

    Jupp genau.
    In meinem Fall speziell:
    Wenn ich die Zeilen aus dem DataSet in meine List Of... schiebe, dann ist die Spalte Ordered immer leer (DBNull).
    Binde ich diese List Of nun an mein Datagridview, kommt eben die Ordered is null Exeption.
    Da stellt sich mir die Frage, wie sinvoll es hier ist da DummyWerte reinzuschmeißen, wenn ich (z.B. mit deinem Filter Vorschlag) auch bequem mit DBNull weiter machen kann.

    Edit: Also es reicht ja hier nicht auf DBNull zu testen (das kann ich mir sogar sparen, weil der Wert ja immer Null ist)
    Schnellschuss: Wie wär's denn, wenn Du einfach verhinderst, dass im DGV die DBNull-enthaltenen Spalten überhaupt angezeigt werden? Sie enthalten eh keinen relevanten informativen NährMehrwert. Dazu für das DGV als Datenquelle die DataSet1.CustomerOrderRow einstellen und dann die Caller- und Ordered-Spalte löschen. Hat auch den Vorteil, dass Du dann gleich zur Designzeit das Aussehen des DGVs anpassen 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.
    Ich habe es natürlich vorher ausprobiert ;) , siehe Anhang
    Mit der Einstellung zur Designzeit, dass die DataSource für's DGV Deine CustomerOrderRow ist, machst Du erstmal im Voraus dem DGV klar, was für Datentypen kommen.
    Bilder
    • frmCustomerOrders.png

      23,96 kB, 624×629, 66 mal angesehen
    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.
    Ok. Dann würde also das mit der List of wohl funktionieren.
    Allerdings brauche ich ja dennoch eine DBNull Abfrage, um mein Programm DAU tauglich zu machen.
    Wenn der User z.B. keinen Artikelnamen vergibt (welcher ja aber in meiner Form angezeigt werden soll), kommt es ja wieder zum Fehler. Und diese Spalte kann ich ja nicht "ausblenden".

    Aber der Vollständigkeit halber, was spricht gegen den Lösungsansatz aus Post 19?

    VB.NET-Quellcode

    1. Private Function SearchCustomerOrders(SupplierID As Integer) As Boolean
    2. Dim COrderRow = DataSet1.CustomerOrder
    3. If COrderRow.Rows.Count < 1 Then Return False
    4. For Each row In COrderRow
    5. If row.IsOrderedNull AndAlso row.SupplierID = SupplierID Then
    6. Return True
    7. End If
    8. Next
    9. Return False
    10. End Function
    11. Private Sub Aufruf
    12. If SearchCustomerOrders(SelectedSupplier.ID) Then
    13. Dim frm As New frmCustomerOrders
    14. frm.CustomerOrderBindingSource.DataSource = Me.DataSet1
    15. frm.CustomerOrderBindingSource.Filter = String.Format("Ordered Is Null And SupplierID = {0}", SelectedSupplier.ID)
    16. frm.Show()
    17. End If
    18. end sub

    Das ist meiner Ansicht nach das Einfachste und ich denke auch noch Codetechnisch vertretbar.
    Ich muss nicht die ganze DataTable durchforsten, sondern nur bis zur ersten offenen Kundenbestellung.
    Dann kommt der Filter drauf.
    Und es ist automatisch gegeben, dass Bestellungen, welche ich in der neu öffnenden Tätige (also Spalte Ordered mit Wert belege), aus der Liste verschwinden. Diese müsste ich ja in der List Of selber entfernen (denke ich)

    DerSmurf schrieb:

    Wenn der User z.B. keinen Artikelnamen vergibt
    dann sollte das Programm an der Stelle, wo man den Artikelnamen eingeben muss, schon meckern. Leider sehe ich auf Anhieb in Deinem Testprogramm nicht jene Stelle, wo man einen Artikelnamen eingeben kann und entsprechend an welchem Punkt das Programm intervenieren müsste. Daher ist da ein Tipp schwierig.

    DerSmurf schrieb:

    was spricht gegen den Lösungsansatz aus Post 19?
    Nix. Wollte nur eine Alternative anbieten.
    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.
    Vielen Dank @VB1963, das werde ich mir heute Abend (auf meinem private PC), zu gemüte führen.

    @ErfinderDesRades das DGV wirft nur eine Exception, wenn ich meine List(of Datarow) binde (zur Laufzeit).
    Binde ich ganz normal die Bindingsource im Designer und haue einen Filter drauf, wird DBNull durch leere Zellen dargestellt.
    @VB1963 Danke für das Beispiel. Nun verstehe ich was du die ganze Zeit willst xD
    Aber eine eher grundsätzliche Frage hierzu. Denn folgendes verstehe ich nicht.
    Macht es nicht mehr Sinn eine nicht benötigte Zelle in einer DataTable einfach leer zu lassen, als da einen Default Wert einzutragen und die Anzeige dieses Wertes dann per Code zu "unterbinden"?
    Also ich meine warum soll ich ein Datum (01.01.0001 00:00:00) speichern, wenn ich eigentlich gar kein Datum speichern muss, weils schlicht keins gibt?

    @ErfinderDesRades Ich habe den Fehler reproduziert und angehängt.
    Bitte störe dich nicht an all dem auskommentiertem Code (so sieht Testcode bei mir immer aus, wenn ich nicht ganz genau weiß, was ich tue) und bitte ignoriere die globale Property (mir ist bewusst, dass dies ein NoGo ist - aber die Faulheit hat gesiegt)
    Dateien
    • CustOrders.zip

      (51,48 kB, 64 mal heruntergeladen, zuletzt: )

    DerSmurf schrieb:

    Bitte störe dich nicht an...
    Ach, ich störe mich aber so gerne!

    ZB ist das Projekt Strict Off.
    Und kommt auch gleich ein Fehler hoch, wenn man das korrigiert.

    Gugge nochma Visual Studio - Empfohlene Einstellungen - da ist iwo beschrieben, wie man VS so konfiguriert, dass alle neuen Projekte automatisch Strict On sind.

    Oder benutze SolutionExplorer - OpenSource (so mach ich das immer), und erstelle dir ein sauberes Template, von dem du neue Solutions ableitest.
    Dassis insbes. praktisch, wenn man üblicherweise Helpers-Projekte mit einbindet.

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

    ich hab da jetzt was mit DatasetExtensions (Framework-OnBord) drangebastelt

    VB.NET-Quellcode

    1. Private Function SearchCustomerOrders(SupplierID As Integer) As DataView
    2. Return DataSet1.CustomerOrder.Where(Function(x) x.IsOrderedNull AndAlso x.SupplierID = SupplierID).AsDataView
    3. End Function
    4. [...]
    5. Dim ShowOrders As New frmCustomerOrders
    6. With ShowOrders
    7. .CustomerOrderBindingSource.DataSource = SearchCustomerOrders(SelectedSupplier.ID)
    8. .Show()
    9. End With
    Weiss nicht, ob das nun tut was es soll...
    Dateien
    • CustOrders00.zip

      (30,74 kB, 64 mal heruntergeladen, zuletzt: )
    Ah. Danke für den Hinweis.
    Option Strict gehört natürlich auch bei mir On.
    Ich musste Visual Studio neu installieren - danach muss ich vergessen haben Option Strict wieder umzuschalten.
    Aber scheinbar habe ich dran gedacht den VIsual Basic Namespace zu entfernen...
    Nja - ist jetzt wieder On.