grundsätzliche Frage zu System.DateTime in typisiertem DataSet

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von MichaHo.

    grundsätzliche Frage zu System.DateTime in typisiertem DataSet

    Hallo,

    ich habe mal eine Grundsätzliche Frage zu System.DateTime.
    Ich habe ein typisiertes Dataset mit Binding Source. Die Daten werden in einem DataGridview angezeigt. Das Schreiben und Lesen der Daten geht ausschließlich über WriteXML und ReadXML.
    In einer Spalte wird ein Datum gesetzt. die entsprechende Spalte ist als System.DateTime deklariert (im DataSet Designer) im DatagridView Designer ist die Spalte mit

    VB.NET-Quellcode

    1. d
    fromatiert und somit wird im DataGridView immer nur das Datum angeziegt.
    Aber in die XML wird grundsätzlich das Datum inklusive Uhrzeit rein geschrieben. sieht dann so aus: <Austritt>2015-07-10T00:00:00+02:00</Austritt>.
    Ist es irgendwie möglich das nur das Datum ins XML geschrieben wird? am besten so: <Austritt>10.07.2015</Austritt>
    Ich weise keine Daten über Code hinzu, im Code werden lediglich Filter gesetzt, also muss die Formatierung ja irgendwie über den Designer laufen...
    Vielen Dank
    Grüße

    Michael
    "Hier könnte Ihre Werbung stehen..."
    Was im geschriebenen Xml steht - da fummel besser nicht dran rum.
    So, wie das Dataset ein Date schreibt, so kann es das auch lesen, und das funktioniert auch in anderen Kulturen und Zeitzonen und pipapo - du ahnst vmtl. nicht, wie schwierig das im Grunde ist, das 100% zuverlässig zu lösen.

    Die Schreibweise wie sie dir vorschwebt entspricht deutscher Kultur, aber wenn Dataset so abspeicherte, und du schickst sone Datei über den Teich, dann würden die drüben daraus ein anderes Datum lesen.

    Und der .Net-Date - Datentyp ist numal kein Datum, sondern ist ein Zeitpunkt. Daher enthält der immer auch Stunde, Minute, Sekunde (und eiglich sogar Millisekunde).
    Klar, wenn man wollte könnte man die Nullen da vlt. abschneiden und würde glaub noch immer richtig lesen, aber Wayne?
    OK, Danke. Ist eigentlich auch wirklich völlig wuppe...

    ich hatte nur gedacht ich müsste das Datum anners da stehen haben wenn ich zum Beispiel mit der DateDiff Funktion abfragen will ob Austritt kleiner 3 Monate als jetzt ist...
    So ganz will mir das nicht funktionieren. Zum Hintergrund: ich hab am Wochenende für den Betriebsrat eine Personal DB aufgesetzt und hier ist es eben so, das bei Austritt ein Datum steht wenn es zum Beispiel ein Leiharbeiter oder befristeter ist. der BR hätte dann gerne das die Zeile, in der der Austritt kleiner 3 Monate des aktuellen Datums ist, gelb markiert wird.
    "Hier könnte Ihre Werbung stehen..."
    achkomm!
    Es sind 12 Zeilen, davon vlt. 6, die etwas enthalten mögen, was du vlt. nicht auf Anhieb verstehst, wegen Grundlagen-Lücken.
    Und es ist Punkt für Punkt erklärt, und auch mit Links garniert, wo man Grundlagen nachholen kann.

    Also kann schon sein, dasses Arbeit macht, es zu verstehen, aber diese Arbeit musst du so oder so leisten, denn ohne Grundlagen kann man halt nicht programmieren.
    Ausserdem kannst du ja Fragen stellen.
    Hahahah... super Antwort.

    Nee, das ich da noch was aufholen muss ist klar, mich hatte jetzt nur das ganze etwas erschlagen.

    ich habe es jetzt mal so versucht:

    VB.NET-Quellcode

    1. Private Sub PersonalDataGridView_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles PersonalDataGridView.CellPainting
    2. If e.RowIndex < 0 OrElse e.RowIndex >= Me.bsPersonal.Count Then Return
    3. If e.ColumnIndex <> 8 AndAlso e.Value = "" Then Return
    4. If DateDiff(DateInterval.Month, Date.Now, e.Value) < 3 Then
    5. e.CellStyle.BackColor = Color.Yellow
    6. End If
    7. End Sub


    Beim Starten des Programms wird Garnichts mehr angezeigt :)
    "Hier könnte Ihre Werbung stehen..."
    Ja, leider hab ich es drinn wegen meinem Fernstudium ;( sonst bin ich dauernd nur am Umschalten.....

    aber es wird wirklich nix angezeigt. (Gut, außer das Datagridview mit der HeaderLeiste)

    EDIT: mal grade off-Topic: Du hattest in einem anderen Thread mal geschrieben wegen Grundlagen lernen, das Du das über TeamViewer machen könntest (Da hatte dich jemand wegen Mentor gefragt). Wie würde so etwas aussehen? Und was würde es kosten? kannst mir dazu ja vielleicht ne PM schreiben?
    "Hier könnte Ihre Werbung stehen..."

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

    wieso haste das noch nicht hingeschmissen? Lernen tust du da doch offsichtlich nix, jdfs. nix nützliches.

    Und du versicherst mir wirklich, dass es an dieser Methode liegt, dass nix angezeigt wird?
    teste das mal, indem du sie einfach auskommentierst.
    Falls es sich bestätigt, weiß ich auch nicht - dann sehe ich nur noch die Möglichkeit, dass du eine Sample-Solution anhängst, die den Fehler reproduziert.
    sobald ich das auskommentiere, läuft wieder alles. lasse ich es so stehen, wird das Datagrifview angezeigt und die HeaderLeiste ist da bis auf das Fled Austritt und nachfolgende.

    Ich muss jetzt erstmal wech, werde dir aber nachher noch screenshots senden.
    Im Momnet bekomme ich aber auch einen Fehler in der DateDiff Funktion angezeigt und ich denke da liegt der Fehler weil i9ch nicht richtig auf den Inhalt der Zelle Austritt hinweise:

    VB.NET-Quellcode

    1. rivate Sub PersonalDataGridView_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles PersonalDataGridView.CellPainting
    2. If e.RowIndex < 0 OrElse e.RowIndex >= Me.bsPersonal.Count Then Return
    3. If e.ColumnIndex <> 8 AndAlso e.Value Is "" Then Return
    4. If DateDiff(DateInterval.Month, Date.Now, e.Value) < 3 Then
    5. e.CellStyle.BackColor = Color.Yellow
    6. End If
    7. End Sub
    "Hier könnte Ihre Werbung stehen..."
    ja, bin ich regelrecht schadenfroh, zu sehen, wie der Deppen-Namespace und Strict Off bei dir Sch... bauen :P

    Und vlt. versuchstes doch nochmal mit meim Tut, weil da gehts ja.

    Aber ansonsten scheint mir, dass bei dir der Debugger spinnt. Also du solltest nicht nichts angezeigt bekommen, sondern eine Fehlermeldung.

    ja, und mit einem Screenshot kann ich das nicht untersuchen - ich könnte es nur untersuchen in einer Solution, die den Fehler reproduziert, wie gesagt.
    hahahah... Schadenfreude ist doch die beste Freude :)

    Das kein Error kam war natürlich auch mein Problem, weil ich die DataError Ereignis abgefangen und umgeschrieben hab :)

    Was ich wohl noch nicht verstanden habe ist, welchen Parameter ich bei der DateDiff Funktion als 3. Parameter angeben soll.

    DateDiff verlangt ja als Parameter 1 nen String (welchen Intervall er rechnen soll), Paramter 2 Date (ist doch das Datum von wo aus gerechnet werden soll? also Date.Now, und als Parameter3 wieder ein Date (das was er vergleichen soll). Also müsste es bei mir ungefähr so aussehen, oder?

    VB.NET-Quellcode

    1. DateDiff(DateInterval.Month, Date.Now, inhalt von aktueller Austritt Zelle)


    das muss ich dann mit e.value abfragen, oder?

    ich bekomme es leider nicht hin, da kann ich Dein super Tut sooft lesen wie ich will, irgendwo ist da ein Knoten im Hirn....

    Kannst Du mir einen klitzekleinen Schubser in die richtige Richtung geben, oder ein profanes Beispiel für genau dieses Vorhaben?
    "Hier könnte Ihre Werbung stehen..."
    hab ich doch schon: Klemm den Deppen-Namespace ab, und hau die DateDiff-Methode in die Tonne! Visual Studio - Empfohlene Einstellungen

    Und dann guck dir in meim Tut an, wie man den zugehörigen Datensatz typisiert aus der zugehörigen BindingSource abruft.
    Ein Datum-Interval von 2 Monaten ermittelst du so:

    VB.NET-Quellcode

    1. dim isIn2Month As Boolean = myRow.myDate.AddMonths(2)>Date.Today
    Beachte, dass die im Vergleich stehende Datarow-Property aber bitte auch vom Datentyp Date sein muss.
    Mach einfach Strict On, dann sagt dir der Compiler in solchen Dingen sofort bescheid.

    Ups - das Tut von vorhin zeigt ja garnet, wie man die typisierte DataRow ermittelt - da wäre dieses hier ja geeigneter: noch ein coloriertes Datagridview - Listing#3
    Wenn dir das komplex erscheint, dann konzentriere dich einzig, wie die typisierte NumbRow ermittelt wird - zeilen #4, #5.
    Das annere kannste ja erstmal so lassen - wenns auch nicht sehr schick ist, bei jedem Zeichnen am Cellstyle rumzufummeln.

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

    Einstellungen habe ich gerade gesetzt und auch ne Vorlage erstellt :)
    Namespace ist raus, mal gucken was ich jetzt alles neu anpassen muss :)
    Gut, dann lese ich das tut jetzt nochmal :) Alle guten Dinge sind 3 :)
    Melde mich wieder falls es dann immernoch klemmt... Danke Dir!
    P.S. hattest Du meine EDIT in Post#9 gesehen?
    "Hier könnte Ihre Werbung stehen..."
    Hmm, also ich hab meinen Code jetzt so eingetragen

    VB.NET-Quellcode

    1. ​Private Sub dgvPersonal_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles dgvPersonal.CellPainting
    2. If e.RowIndex < 0 OrElse e.RowIndex >= Me.bsPersonal.Count Then Return
    3. Dim drv = DirectCast(dgvPersonal.Rows(e.RowIndex).DataBoundItem, DataRowView)
    4. Dim rwNumb = DirectCast(drv.Row, dsPersonal.PersonalRow)
    5. Dim isIn3Month As Boolean = rwNumb.Austritt.AddMonths(3) > Date.Today
    6. Dim isSelected = (e.State And DataGridViewElementStates.Selected) <> 0
    7. Select Case dgvPersonal.Columns(e.ColumnIndex).DataPropertyName
    8. Case DsPersonal.Personal.AustrittColumn.ColumnName
    9. If isSelected OrElse isIn3Month = False Then Return
    10. e.Graphics.FillRectangle(Brushes.Yellow, e.CellBounds)
    11. Case Else : Return
    12. End Select
    13. e.PaintContent(e.CellBounds)
    14. e.Handled = True
    15. End Sub


    Wenn ich jetzt die Anwendung starte ist das DataGridView leer, es gibt keine Zeilen. Klicke ich auf irgendeine Zelle, dann wird die Zelle markiert un der Inhalt dargesetllt. man muss also wild umherklicken damit einige Zellen angezeigt werden.

    Die Spalte Austritt wird auch gelb hinterlegt, allerdings werden alle Zellen gelb hinterlegt, egal ob das Datum darin 3 Monate größer als heute ist oder nicht....

    Isch werd noch bekloppt....
    "Hier könnte Ihre Werbung stehen..."
    eine Fehlerquelle könnte noch sein, dass in AustrittsDatum DbNull drinne ist - weißt ja: Wenn nullable Spalten DbNull enthalten gibts einen Fehler, wenn man versucht, trotzdem den Wert abzurufen.
    Und vlt. hast du aus post#13 nix gelernt, und behandelst noch immer das DatagridViewError-Ereignis, und fängst dir da den Fehler selber weg, damit du nun schön wie Ochs vorm Berg... ;) .

    naja, sorry - Spekulation.
    womit du mal wieder Recht hast. In der Spalte Austritt steht nur dann ein Wert, wenn der Mitarbeiter befristet eingestellt ist, oder ein Leiharbeiter ist.

    Also müsste ich noch irgendwie DBNull abfangen.

    Aber das ich keine Meldung bekomme kann ich nicht nachvollziehen, ich habe den kompletten DataError part aus dem Programm gelöscht, somit sollte der Debugger ja was sagen, tut er aber nicht....
    "Hier könnte Ihre Werbung stehen..."
    Ich habe es tatsächlich selbst hin bekommen.... hab mir die Date Funktion noch einmal angeschaut und die Directcast Geschichte. Dadurch bin ich darauf gekommen das ich IsNull ja auch direkt abfangen kann.

    Mein funktionierender Code sieht nun so aus:

    VB.NET-Quellcode

    1. Private Sub dgvPersonal_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles dgvPersonal.CellPainting
    2. If e.RowIndex < 0 OrElse e.RowIndex >= Me.bsPersonal.Count Then Return
    3. If e.ColumnIndex <> 8 Then Return
    4. Dim drv = DirectCast(dgvPersonal.Rows(e.RowIndex).DataBoundItem, DataRowView)
    5. Dim rwNumb = DirectCast(drv.Row, dsPersonal.PersonalRow)
    6. If rwNumb.IsAustrittNull Then Return
    7. If Date.Today.AddMonths(3) > rwNumb.Austritt Then
    8. e.CellStyle.BackColor = Color.Yellow
    9. End If
    10. End Sub

    "Hier könnte Ihre Werbung stehen..."