Datum formatieren für DGV

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von strzata.

    Datum formatieren für DGV

    Hallo und guten Abend,
    was muss man im CellStyleGenerator in VS 2017 als Format für eine Zelle angeben, wenn man ein kurzes deutsches Datum (12.01.22) im DataGrid sehen will. Die Werte werden aus einer MySql DB in eine DataTable geholt. Die Spalte in der MySql-Tabelle ist als Datum formatiert. Mit SELECT * sehe ich das Datum als "2022-01-12". In die DataTable dt740 hole ich die Werte zeilenweise, weil dabei Berechnungen durchgeführt werden.

    VB.NET-Quellcode

    1. ElseIf dt740.Columns(CStr(rw("HLM01")).DataType = GetType(Date) Then
    2. newrow(CStr(rw("HLM01")) = CDate(rw("HLM02"))
    3. ElseIf dt740.Columns(CStr(rw("HLM01")).DataType = GetType(Decimal) Then
    4. newrow(CStr(rw("HLM01")) = CDec(rw("HLM02")) * 100


    Die newrow, wenn sie fertig berechnet ist, adde ich dann zur Table und gebe diese dem Grid als DataSource. Im Grid ist die Column "Datum" eine DataGridViewTextBoxColumn. Als DefaultCellStyle (im VisualStudio CellStyle-Generator) habe ich alle möglichen Format-Werte eingegeben (d, "d", "dd.MM.yy" und andere), aber im Grid erscheint immer das lange Format "12.01.2022"
    Wie löst man das Problem?
    Grüße Norbert
    Ein DataGrid hat keine DefaultCellStyle Property. Wenn DataGridView, dann schreib auch DataGridView.

    Ich würde da eher das DataGridView CellFormatting-Event nehmen. Wenn ioch so ein Format eingeben will im Designer bekomme ich einen Fehler invalid value

    Wenn du für eine Column den DefaultCellStyle ein DatumFormat einstellst, kannst du den desiredType nutzen, ansonsten den Columnindex(im DataGridViewCellFormattingEventArgs)

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
    2. If e.DesiredType = GetType(DateTime) AndAlso Not e.Value Is Nothing Then
    3. Dim dateTime As New DateTime
    4. If DateTime.TryParse(e.Value.ToString(), dateTime) Then
    5. e.Value = dateTime.ToString("dd.MM.yy")
    6. End If
    7. End If
    8. End Sub


    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Danke für die schnelle Antwort. Ich dachte es gibt einen Formatbezeichner und ich finde ihn nur nicht. Es gibt doch so viele für alles mögliche (Integer mit/ohne führende Nullen, Währung "c", Dezimal und und ...). Nur für das kurze Datumsformat nicht? Wenn das stimmt, dann muss ich natürlich das CellFormatting bemühen.
    Wenn wir hier mal nachsehen:
    learn.microsoft.com/de-de/dotn…ing?view=netframework-4.8

    Sehen wir das kein Format wie du es haben möchtest vorhanden ist. Bleibt halt nur selbst ein eigenes Format anzugeben. Mir flog im Designer eine Exception um die Ohren, entweder geht das das nicht oder ich hab was falsch gemacht.Trotzdem im ColumnEditor für diese Column DateTime festlegen, dann spart man sich über einen ColumnIndex drauf zugreifen zu müssen, welcher sich durch Änderungen ändern könnte.

    Edit:
    Ich finde so ein kurzes Datumsformat nicht schön. Siehe heutiges Datum 23.02.23
    Was ist da jetzt Tag oder Jahr? Nicht eindeutig.....
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

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

    Hast mich fast überzeugt ;)
    Und wie steht es mit CultureInfo. Ich hab da leider zu wenig Ahnung. Mein Grid passt gerade so schön auf das Form. Das Layout ist perfekt. Nur in der einen Column passt das Datum mit 10 Zeichen eben nicht rein. Und das stört. Ich schlaf nochmal drüber ...

    P.S. Eigentlich hast Du mich überzeugt.
    CultureInfo würde ich sagen kann man hier drauf verzichten, das yyyy-MM-dd format wird im Cellformatting beim TryParse erkannt und wir geben ein eigenes Format für die Ausgabe an, ich denke das passt. Korrigiert mich wenn doch besser mit CultureInfo.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

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

    Hm … klappt bei mir wie gewünscht. VS2022 CE 17.6.0 Preview 1

    VB.NET-Quellcode

    1. Friend Class FrmMain
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. FooBindingSource1.Add(New Foo With {.Bar = Date.Today, .Name = "sdfk"})
    4. End Sub
    5. End Class
    6. Friend Class Foo
    7. Property Bar As Date
    8. Property Name As String
    9. End Class


    ##########

    Späßleshalber noch ein Testprojekt anbei.
    Bilder
    • Settings.png

      15,14 kB, 547×568, 63 mal angesehen
    • Result.png

      3,41 kB, 491×389, 56 mal angesehen
    Dateien
    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“ ()

    Ich habe noch VS 2022 CE 17.4.5 am laufen, kann das jetzt aber auch nicht mehr reproduzieren. Da war wohl was durch das rumgeklickste durcheinander gekommen. Bei mir kam immer einer MessageBox mit "Invalid value". Es sei denn ich hab was aus der Auflistung genommen(bei Column-DefaultCellStyle).
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Vielen Dank! Wie ich oben schon geschrieben hatte, hab ich dd.MM.yy schon ausprobiert und es kam trotzdem das lange Format. Muss damit zusammenhängen, dass die Werte aus der MySql Tabelle geholt werden. Wenn man ein "normales" Datum (z.B. von Date.Now) hat, scheint es zu klappen.
    Das halte ich für unwahrscheinlich, aber für mich nicht nachprüfbar. Wenn die Daten aus der DB kommen, müssen sie ja in einen .NET-Datentyp verpflanzt werden. Wenn das dann Date ist, sehe ich keinen Grund, warum es da Darstellungsunterschiede geben soll.
    Welchen Datentyp hat die Zielvariable Deines DB-Eintrags? Kannst Du einen Wert mal posten? Vielleicht ist es die interne Geschichte oder die Zeitkomponente oder whatever.
    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“ ()

    Du hast also eine DataTable, und die DataTable hat eine DateTime-Spalte, die nicht so angezeigt werden will wie Du es willst, richtig?
    Legst Du die DataTable selber an oder ist die in nem tDS-Generator erstellt?
    Wenn Du nun aber die DataTable dem DGV als DataSource gibst, werden die zuvor im Designer erstellten Columns ignoriert. Es werden die Columns der DataTable hinzugefügt. Dann wär es kein Wunder, warum die Einstellungen scheinbar nichts bewirken, weil die eingestellten Spalten nicht verändert/befüllt werden.
    Bilder
    • leeres DGV vor DataTable als DataSource.png

      1,45 kB, 452×223, 42 mal angesehen
    • gefülltes DGV mit DataTable als DataSource.png

      2,2 kB, 452×223, 46 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.

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

    strzata schrieb:

    Wie kann ich hier ein Bild (png, auf Platte gespeichert) einfügen?
    Erweiterte Antwort => Dateianhänge => Hochladen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke! So einfach kanns sein.
    In der Table steht im Feld C6501 ein Datum (Bild 1).
    Die Rows adde ich im Code zum DGV (Bild 2).

    Im Netz habe ich gefunden:
    DGVTab1.Columns(1).ValueType = GetType(System.DateTime)
    Aber auch das löst das Problem nicht.
    Bilder
    • Unbenannt.png

      12,01 kB, 468×350, 44 mal angesehen
    • Unbenannt2.png

      7,58 kB, 567×74, 44 mal angesehen
    • Unbenannt3.png

      25,21 kB, 741×475, 47 mal angesehen

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

    Die Spalte mit dem Datum hat den Titel "C6501".
    Du manipulierst aber die Spalte mit dem Titel "Datum".
    Du manipulierst also eine Spalte, die später gar nicht Deine Daten beinhaltet.
    Wie geschrieben: Wenn das DGV Spalten hat und ne DataSource bekommt, kommen neue Spalten dazu.
    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.
    Unbenannt.png stellt die DataView (dv) meiner DataTable T740 dar.
    Das Grid hat kein DataSource!
    Ich gehe die DataRowViews zeilenweise durch,

    For Each rwv As DataRowView In dv

    führe einige Berechnungen innerhalb der rwv durch und adde die rwv dann zum Grid

    r = New String() {CStr(rwv("C3101")), CStr(rwv("C6501")), ind, CStr(rwv("C6525")), icd, hlm, CStr(anz), CStr(rwv("C6590"))}
    Dim i = DGVTab1.Rows.Add(r)


    Die Spalte C6501 wird ins Grid also als String geschrieben.

    rwv("C6501") ist #1/11/2023 12:00:00 AM# (siehe Bild Unbenannt2)
    CStr(rwv("6501")) ist 11.01.2023

    Abgesehen von meinem ursprünglichen Wunsch, das Datum in Kurzform zu bekommen (damit kann ich mittlerweile leben - habe das Layout umgebaut), suche ich jetzt nach der Möglichkeit, die Spalte mit Klick auf den Header korrekt nach Datum zu sortieren. Könnte das gehen?
    Bilder
    • Bild3.png

      107,74 kB, 917×305, 42 mal angesehen

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

    strzata schrieb:

    Die Spalte C6501 wird ins Grid also als String geschrieben.
    Eh … ja. Und dann wunderst Du Dich, warum das Format für Datum nicht greift?
    Wenn Du Strings in eine Tabellenspalte kloppst, dann kannst Du das mit der korrekten Sortierung nach Datum auch gleich vergessen, da Strings anders vom Computer sortiert werden als Datumsangaben.
    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.
    Nee, das war kein Schimpfen (bin ja kein Elternteil oder Lehrer von Dir), eher ein "so geht's leider nicht". Zum Glück ist jetzt die Ursache klar. Probier es doch mal ohne CStr für die Datumsspalte. Das DGV nimmt auch NichtStrings. Und wenn erstmal ein Datum drin ist, kann man damit auch wie mit nem Datum rumwerkeln: formatieren und sortieren z.B.
    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.