Datagridview Spalte mit Datumsformat - Zellen ohne Inhalt nicht formatieren

  • VB.NET

Es gibt 39 Antworten in diesem Thema. Der letzte Beitrag () ist von Yanbel.

    VB.NET-Quellcode

    1. If InvoiceReceive = Nothing Then
    2. SelectedOrder.InvoiceReceive = Nothing
    3. Else
    4. SelectedOrder.InvoiceReceive = InvoiceReceive
    5. End If
    6. If InvoiceDate = Nothing Then
    7. SelectedOrder.InvoiceDate = Nothing
    8. Else
    9. SelectedOrder.InvoiceDate = InvoiceDate
    10. End If

    Das ist überflüssig. Alle Ifs und Elses weglassen. z.B. reicht doch SelectedOrder.InvoiceDate = InvoiceDate inhaltlich vollkommen aus, egal, ob es Nothing ist oder nicht.
    Bin grad unterwegs. Ich schau später nach den Unterschieden zu meinem Code.

    ##########

    Von welchem Typ ist orderdate?
    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.

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

    Jetzt hast du mich verwirrt.
    Um nicht den Wert der Date Variable (die nicht Nothing sein kann) ins DataSet zu schreiben, habe ich den Code doch geändert.
    Lasse ich die Bedingungen weg, habe ich doch meinen alten Code wieder.

    VaporiZed schrieb:

    Ein Datum kannst Du löschen, indem Du im tDS direkt Nothing abspeicherst. Das geht mit Deinem Code nicht, da Du ne Date-Variable als Zwischenspeicher nutzt.
    Das direkte Abspeichern von Nothing ist was anderes, als wenn Du den Wert einer Date-Variable, der einen Wert Nothing abspeicherst.


    Edit: Orderdate im Code ist vom Typ Date und orderdate im DS ist vom Typ System.DateTime.
    Das trifft auch auf alle anderen Datumsvraiablen und Datumsspalten im DS zu.
    Zu Beginn des Codes wird aber geprüft, ob es ein orderdate gibt, wenn nicht (oder wenn dieses kein gültiges Datum ist), wird der Code abgebrochen. Eine Bestellung soll immer ein Bestelldatum haben.

    Edit2: ich habe mal im der Formatierung der DgvSpalte etwas bei Null Value eingetragen.
    Sobald ich aber einmal auf speichern drücke, wird der Null Value nicht mehr angezeigt, sondern mein geliebtes 01.01.01.
    Also muss ja irgendwie doch ein Datum im DataSet landen.

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

    Ich hasse es, wenn ich meine Lösung nicht nachstellen kann.
    Bzgl. Deiner Anmerkung: ja, da hast Du recht. Und auch mit: Übergabe von Nothing ans tDS ergibt 01.01.0001
    Ich hab zwar noch was gefunden, ist aber unschön(er): Übergib nicht an das Datum Deiner Row Nothing, sondern an das entsprechende ItemArray DBNull.Value.
    Wenn also bei SelectedOrder das DeliveryDate an Position 4 steht, dann SelectedOrder.ItemArray(3) = DBNull.Value
    Sorry
    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.
    Meinen = Nothing-Vorschlag kann man einfach ersetzen durch .SetOrderDateNull
    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.

    DerSmurf schrieb:

    Fragezeichen
    Wenn du mit dem CellFormatting-Event arbeitest, musst du auch berücksichtigen, welche Zelle gerade am Wickel ist. Im DGV werden alle Zellen mit diesem Event abgearbeitet - auch die Anfügezeile!

    VaporiZed schrieb:

    dann SelectedOrder.ItemArray(3) = DBNull.Value
    Warum nicht gleich typisiert:

    VB.NET-Quellcode

    1. SelectedOrder.SetDeineSpalteNull()

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

    ?
    Siehe meinen Vorpost
    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.

    VaporiZed schrieb:

    Ich hasse es, wenn ich meine Lösung nicht nachstellen kann.

    Dazu habe ich gerade abhilfe geschaffen.
    Habe mal das Problem in einem Demoprojekt nachgestellt, ohne den ganzen Schnick Schnak drumherun.
    Vor allem ohne Verschlüsselung, damit ich auch tatsächlich gucken kann, was in der xml steht.

    Edit: neuer Download 2 Posts tiefer.

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

    VaporiZed schrieb:

    Meinen = Nothing-Vorschlag kann man einfach ersetzen durch .SetOrderDateNull
    Grade bei OrderDate sollte das nicht so laufen.
    Sondern OrderDate sollte AllowNull=False konfiguriert werden, damit ühaupt niemals jemand auf die Idee kommen kann, eine Bestellung ohne Datum anzulegen.
    Hingegen für DeliveryDate ists sinnvoll, Nullwerte zuzulassen, um noch nicht gelieferte Bestellungen zu modellieren.
    Eigentlich ein Edit.
    Habe gerade das Demoprojekt neu hochgeladen.
    Wenn ich mit selectedorder.SetSpaltennameNull arbeite, scheint es zu klappen.
    Die enstprechende Spalte taucht dann in der xml nicht auf - und sie bleibt auch im Dgv leer.

    Genauso bin ich dann auch bei den Summen (Net7, Net19 und Total) vorgegangen.
    Wenn es hier keine Eingabe gibt, und kein Rechnungsdatum vergeben ist (es also keine Rechnung gibt), wird nix gespeichert.
    Gibt es eine Rechnung (Rechnungsdatum belegt), wird aus einem leeren Net7, oder Net19 Wert eine 0,00.

    Außerdem habe ich auch die Textboxen im Designer formatiert. Databinding --> erweitert.
    Und nicht im Code.

    Das sortieren der DGV (welches ich an mehreren Stellen aufrufe, Formload, SpeichernButton und LöschenButton) ist noch was unschön, aber das scheint ja im Designer nicht zu gehen.
    So sollte doch jetzt alles i.O. sein, oder nicht?
    Dateien
    • DateProblem.zip

      (38,69 kB, 49 mal heruntergeladen, zuletzt: )
    @ErfinderDesRades: Ja, das ist demSmurf und mir klar, das hatte der TE ja auch schon klargestellt. Es ging ja nur um die Umsetzung von "echtem" Nothing, also in Wirklichkeit DBNull in ner DateTime-Spalte.
    @DerSmurf: Ja, sieht soweit gut aus. Jeder würde es wahrscheinlich hier etwas anders machen, aber sonst passt das mit dem DBNull@tDS. Wenn man davon absieht - aber auch das hatten wir: Date-Auswahl am besten mit Kalender oder DateTimePicker ;) . Aber es ist Dein Programm.
    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.
    Super, danke :o)
    Mit dem DateTimePicker tue ich mich etwas schwer - ich werde eine Zwischenlösung machen denke ich.
    In VBA ist es so (da gibt es keinen DateTimePicker), dass ich alles mit Textboxen eintrage.
    Um die Datumseingabe etwas angenehmer zu gestalten, habe ich im Change Event der Textbox eine Funktion erstellt, die mir automatisch die Datumspunkte und die Jahreszahl während der Eingabe setzt.
    Für das Datum von heute gebe ich also z.B. nur 2607 ein und es werden während der Eingabe automatisch die Punkte, bzw. 2019 ergänzt.
    Daran habe ich mir sehr gewöhnt, das "manuelle" schreiben eines Datums in den DateTimePicker wäre also sehr lästig.
    Ich denke ich werde das Change Event meiner Datumstextboxen in Vb.Net genauso machen wie in VBA.
    Aber ich werde wohl zusätzlich einen DateTimePicker einbauen (in einer Form aufrufbar über einen Button oder so), um das Datum mit dessen Hilfe in die Textbox zu schreiben.
    Denn machmal weiß ich auch nur, dass war doch letzte Woche Dienstag...
    ich hab mal eine Alternative gebastelt.
    Weil ich find das geht auch vonne Benutzerführung her nicht, dass man einen DetailView anzeigt, der aus lauter ungebundenen Controls besteht.
    Und "Speichern" bedeutet dann, dass man die ungebundenen Control-Werte in den Datensatz schreibt.
    Was ich daran nicht mag ist, dass unklar ist, ob die EinzelControls jetzt den aktuellen Datensatz darstellen, oder ob sie den Datensatz darstellen, wie er ist, wenn er "gespeichert" wurde.

    Also ich bevorzuge einen eigenen Dialog zu öffnen, wenn man den aktuellen (oder einen neuen) Datensatz bearbeiten will (beachte das Menü meines Samples).
    Dann weiss man, was angezeigt wird, nämlich der BearbeitungsZustand eines Datensatzes (current oder neu).
    Und man kann canceln, wenn man findet, dass man Wurst eingegeben hat.

    Dassisn Standard-Task, daher habich das generisch in meinen Helpers-Bibliotheken ausprogrammiert.
    So ists für mich bequem - ich binde meine Bibliotheken ein, und dann kann ich das Dataset laden, speichern, Datensätze daraus bearbeiten etc...

    Für dich ist das Problem, mit Helper-Projekten umgehen zu lernen.
    Und wie man elegant einen Datensatz-Editier-Dialog erstellt (auch dafür enthält WinFormHelpers eine Kopiervorlage).

    Wie man mit dem Kram arbeitet habich in verschiedenen Videos gezeigt - ich weiss aber nicht mehr genau, welche.
    Aber egal - vermutlich ist keines dieser Videos unnütz angeguckt.
    Also suchemal nach Videos auf
    vier Views-Videos
    Daten laden und speichern
    Ach guck - hier ist genau gezeigt, wie man Editier-Dialoge zusammenkloppt: Daten laden, speichern, verarbeiten - einfachste Variante

    Btw: Das Formatierungs-Problem ist gelöst, oder?

    PS: Die Sortierung habich einfach durch eine Designer-Einstellung an der BindingSource abgehandelt.

    PSS: Hier der bereinigte Code, also alles rausgeworfen, was nu nicht mehr nötig ist:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports DateProblem.DataSet1
    3. Public Class Form1
    4. Private _Datafile As New FileInfo("Data.xml")
    5. Public Sub New()
    6. InitializeComponent()
    7. DataSet1.Order.orderdateColumn.DefaultValue = Date.Today
    8. DataSet1.Register(Me).DataFile("Data.xml")
    9. End Sub
    10. Private Sub BTNDelOrder_Click(sender As Object, e As EventArgs) Handles BTNDelOrder.Click
    11. If bsOrder.Count > 0 Then bsOrder.RemoveCurrent()
    12. End Sub
    13. Private Sub AnyButton_Click(sender As Object, e As EventArgs) Handles btLoad.Click, btSave.Click, btEditCurrent.Click, btEditNew.Click
    14. Select Case True
    15. Case sender Is btLoad : DataSet1.Fill
    16. Case sender Is btSave : DataSet1.Save(Me)
    17. Case sender Is btEditCurrent : bsOrder.EditCurrent(Of diaEditOrder)
    18. Case sender Is btEditNew : bsOrder.EditNew(Of diaEditOrder)
    19. End Select
    20. End Sub
    21. End Class
    Übersichtlich, ord? 8-)
    Dateien
    • DateProblem01.zip

      (218,36 kB, 44 mal heruntergeladen, zuletzt: )

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

    @ErfinderDesRades
    Zu deinen Videos (nicht nur die geposteten, sondern alle auf Youtube) diese habe ich mehrere male verschlungen und bin überaus dankbar, dass es sie gibt.
    Und sie sind mir nach wie vor eine große Hilfe, denn oft weiß ich nicht mehr genau wie etwas geht, aber ich weiß ich habe es mal in einem deiner Tutorials gehört. Ich weiß aber nicht wo - also gucke ich doch wieder alle...
    Deine Helpers Datei ist in meinem Projekt eingebunden und ich nutze an vielen Stellen das Editnew und EditCurrent(of Formwhatever).
    Btw. dass ich deine Videos kenne und auch deine Helpers nutze, sollte dir bekannt sein.
    Immerhin habe ich an mehreren Stellen um deine "aktualisierte Version" gebeten. zwinker zwinker

    ErfinderDesRades schrieb:

    Was ich daran nicht mag ist, dass unklar ist, ob die EinzelControls jetzt den aktuellen Datensatz darstellen, oder ob sie den Datensatz darstellen, wie er ist, wenn er "gespeichert" wurde.

    Der gezeigt Detailview im Demoprojekt (und auch in meinem Hauptprogramm) ist nicht ungebunden (siehe halt Demoprojekt, oder Posts oben)

    Letzlich ist die Funktionalität identisch (sieht zumindest für den Benutzer identisch aus) mit deinem EditCurrent.
    In den Textboxen werden alle Werte der aktuell ausgewählten DataRow angezeigt und ein speichern ändert sie halt.
    Es gibt keinen Abbrechen Button, aber den brauche ich ja auch nicht, wenn alles in der selben Form passiert.
    In diesem Fall (wie gesagt, editcurrent nutze ich an vielen anderen Stellen) ist es mir aber eben wichtig, ansehnlich das gebundene DGV und den gebundenen Detailview, mit dem sich die Daten ändern lassen, auf einer Form anzuzeigen
    ah - da die Controls gebunden sind, braucht man garkeine SaveOrder - Methode, die iwas nach iwas schreibt.
    Sondern kann einfach BindingSource.EndEdit aufrufen, und alle gebundenen Control-Werte sind übernommen.
    (Annersrum - mit BindingSource.CancelEdit werden alle gebundenen Control-Werte zurückgesetzt.)
    Das Datenquellen Aktulisierungsintervall der Textboxen steht auf never.
    Damit der speichern Button dann auch einen Sinn ergibt, die eingegebenen Benutzerdaten geprüft werden können und dann eben im DS landen, sofern kein Murks eingegeben wurde.
    An sich ist der Code schon anständig, hier noch ein paar Anmerkungen der Form halber:

    Was deine aktuellen Fehler angeht:
    Deine DataColumn steht auf DefaultValue = DBNull und AllowDBNull = True. Du versuchst die DataColumn jetzt mit Nothing zu füttern. Schonmal versucht statt Nothing DBNull.Value einzusetzen?

    DateCheck-Methode:

    VB.NET-Quellcode

    1. Private Function Datecheck(ByRef DatefromSub As Date, ByVal DatefromTB As String) As Boolean
    2. Try
    3. If Not String.IsNullOrWhiteSpace(DatefromTB) AndAlso IsDate(DatefromTB) Then
    4. DatefromSub = CDate(DatefromTB)
    5. Return True
    6. Else
    7. DatefromTB = Nothing
    8. Return False
    9. End If
    10. Catch CastEx As InvalidCastException
    11. DatefromSub = Nothing
    12. Return False
    13. Catch ex As Exception
    14. Throw ex
    15. Return False
    16. End Try
    17. End Function


    Zeile 8:
    Wenn kürzen dann auch konsequent:

    VB.NET-Quellcode

    1. Dim orderDate, deliveryDate, InvoiceReceive, InvoiceDate As Date


    Zeile 9:
    So prüft man korrekt auf Leer-Strings:
    Wenn auch Leerzeichen als Leer-String gelten sollen:

    VB.NET-Quellcode

    1. If String.isNullOrWhitespace(TBOrderDate.Text) Then

    Falls nicht:

    VB.NET-Quellcode

    1. If String.isNullOrEmpty(TBOrderDate.Text) Then



    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.