DatagridView, Timestamp=nothing anzeigen

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

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

    DatagridView, Timestamp=nothing anzeigen

    Hi,

    Ich habe eine DatagridView mit Zellen im Format "Timestamp" (DateTime: "dd.MM.yyyy HH:mm:ss.fff")

    In diesen Spalten speichere ich das "CreationDate" von .exe Dateien. Allerdings können manche .exe Dateien auch fehlen. Dann ist das zugehörige timestamp Feld = nothing. Und dann soll die Zelle in der DatagridView einfach LEER bleiben.

    So hab ich das zu lösen versucht:

    VB.NET-Quellcode

    1. Dim dtsDebug As Date = ...
    2. Dim dtsRelease As Date = ...
    3. Dim dtsTarget As Date = ...
    4. dgvApplications.Rows.Add(Path.GetFileName(DebugBase),
    5. ApplicationStatus,
    6. dtsDebug,
    7. dtsRelease,
    8. dtsTarget)


    Der Aufbau der DatagridView klappt auch prima ! Die Zellen mit "nothing" bleiben leer.

    Nur wenn ich jetzt versuche, nach einer der TimeStamp Spalten zu sortieren, erhalte ich einen Fehler:

    Object must be of type DateTime.


    Klar, "nothing" hat eben keinen Datentyp!

    Natürlich könnte ich einen Default Wert einstellen, etwa "01.01.0001 ...". Aber das will ich nicht,,weil dadurch die Lesbarkeit leidet! Die Zellen sollen einfach LEER bleiben ... und der Sort soll diese Zellen entweder an den Anfang oder an das Ende der DatagridView stellen.

    Das sollte doch ein Problem sein, das nicht nur ich habe. Und demgemäß, sollte es dafür eine vernünftige (d.h. einfache und geradlinige) Lösung geben. Ich hoffe, ihr könnt mir helfen.

    LG
    Peter
    @Peter329 Probier mal dies hier:

    VB.NET-Quellcode

    1. Dim dt As DateTime = Nothing ' explizit deklarieren
    2. MessageBox.Show(dt.GetType.ToString)
    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!
    Vielen Dank erst mal.

    VB.NET-Quellcode

    1. Dim dtsDebug As Date = Nothing
    2. Dim dtsRelease As Date = Nothing
    3. Dim dtsTarget As Date = Nothing
    4. ... 'Befüllen der dts Felder


    Mit diesem Coding werden die Spalten die "nothing" enthalten mit dem Default Wert "01.01.0001 00:00:00:000" befüllt.

    Jetzt "läuft" der Sort fehlerfrei ... aber das ist halt nicht das Layout der Datagrid View, das ich haben möchte!

    LG
    Peter
    @Peter329 Dann musst Du beim Befüllen der Tabelle diesen Fall explizit abfangen / behandeln.
    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!
    Jau, die "nothing" Werte würde ich gerne einer Sonderbehandlung unterziehen. Nur WIE sollte die aussehen?

    VB.NET-Quellcode

    1. If dtsDebug = Nothing Then dtsDebug = ""


    Das klappt natürlich nicht ! Da schlägt "Option strict on" gnadenlos zu.

    Die Frage ist, wie befülle ich die Variable dtsDebug, damit in der DatagridView die zugehörige Zelle leer bleibt!

    Das ist für mich von großer Wichtigkeit. Denn anhand der leeren Felder kann man sehr gut erkennen, ob irgendwo etwas fehlt! Wenn ich einen Default Wert eintrage, kann man das leicht übersehen !

    LG
    Peter
    @Peter329 So natürlich nicht.
    Im True-Fall musst Du dem betreffenden Objekt den Leerstring zuweisen, nicht aber der Testgröße.
    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!
    Das klingt für mich jetzt sehr plausibel. Aber ich habe (ein um's andere Mal) keinen blassen Schimmer wie ich dem betreffenden Objekt in meinem Fall den Leerstring zuweise! Und was bitteschön ist hier die "Testgröße".

    Ich bitte um Nachsicht und wohlwollenden Rat, wenn ich hier nicht so ganz mitkomme. :)

    LG
    Peter
    @Peter329

    VB.NET-Quellcode

    1. If dtsDebug = Nothing Then dtsDebug = ""
    dtsDebug ist hier die Testgröße.
    Dein Code könnte so aussehen:

    VB.NET-Quellcode

    1. Dim datum As String = ""
    2. If dtsDebug <> Nothing Then
    3. datum = dtsDebug.ToString() ' das entsprechende Format
    4. End If
    5. MessageBox.Show(datum)

    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!
    Ok ... das verstehe ich jetzt ...

    VB.NET-Quellcode

    1. Dim strDtsDebug As String = ""
    2. Dim strDtsRelease As String = ""
    3. Dim strDtsTarget As String = ""
    4. If Not dtsDebug = Nothing Then strDtsDebug = dtsDebug.ToString()
    5. If Not dtsRelease = Nothing Then strDtsRelease = dtsRelease.ToString()
    6. If Not dtsTarget = Nothing Then strDtsTarget = dtsTarget.ToString()
    7. dgvApplications.Rows.Add(Path.GetFileName(DebugBase),
    8. ApplicationStatus,
    9. strDtsDebug,
    10. strDtsRelease,
    11. strDtsTarget)


    Das klappt auch soweit ... die "nothing" Werte werden jetzt als leere Zelle dargestellt.

    Auch der Sort klappt ... aber jetzt werden STRINGS sortiert und keine TIMESTAMPS ... und damit ist die Reihenfolge nicht so ganz was man sich wünscht:

    01.10.2016
    02.08.2013
    03.11.2015
    03.12.2006
    03.12.2010

    Man könnte jetzt natürlich einen eigenen Sortierer schreiben ... aber die Lösung scheint mir dann nicht ganz so elegant zu sein.

    LG
    Peter

    Peter329 schrieb:

    und damit ist die Reihenfolge nicht so ganz was man sich wünscht
    Wie ist es denn gewünscht?
    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!
    @Peter329 und die Nicht-Datümmer?
    Da ist vielleicht doch ein eigener Sorter angesagt.
    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!
    Na, normalerweise befülle ich eine Datagrid View Spalte mit einem Timestamp ... und dann wird automatisch nach Datum und Uhrzeit sortiert.

    Wenn ich Strings einstelle, dann werden die Strings sortiert ... , d.h. nach TAG dann nach Monat und dann nach Jahr. Das braucht kein Mensch !

    Ein eigener Sorter nur um bestimmte Zellen leer zu lassen ? Ist das wirklich die Lösung ?

    LG
    Peter
    @Peter329 Du kannst doch dem DGV im CellFormatting-Event sagen, dass er bei einem Nothing einen Leerstring eintragen soll.
    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!
    Im CellFormatting-Event soll man nur die formatierte Anzeige eines Wertes behandeln, d.h. , wie der Wert angezeigt werden soll.
    Wenn man bei DBNull einen Leerstring haben will, ist es besser, wenn man im Dataset-Designer bei der DataColumn die Eigenschaft DefaulValue bedient...
    Ich habe jetzt lange gesucht aber keine Eigenschaft DefaultValue gefunden.

    Ich habe auch keinen Dataset, sondern eine ganz normale DataGrid View .... und da habe ich unter "Spalten bearbeiten" - "DefaultCellStyle" - "NullValue" drei Bindestriche eingetragen. Das war die Option die mir am ehesten dem Rat zu entsprechen schien.

    Allerdings klappt das nicht. Wenn die Zelle mit "nothing" befüllt wird, erscheint nach wie vor als Default "01.01.0001 00:00:00.000"

    mhh ... hab ich etwas falsch verstanden?

    LG
    Peter
    Bilder
    • Null value.jpg

      43,74 kB, 556×568, 88 mal angesehen

    Peter329 schrieb:

    Ich habe auch keinen Dataset, sondern eine ganz normale DataGrid View
    Tja, da bist Du in Deinen Möglichkeiten schon dramatisch engeschränkt. Die Verwenung eines Dataset ist á la longue sicher sehr viel einfacher. Such' hier im Forum mal nach den "Vier Views", da wird's deutlich.
    Tja ... wenn ich vorher gewusst hätte, dass ich dazu eher einen Dataset verwenden sollte ...

    Ich habe jetzt den Hinweis von RFG verfolgt und im CellFormatting Event einfach einen Null-String eingefügt, wenn entweder "nothing" oder das Default-Date "01.01.0001 ...." angeliefert wird.

    Und siehe da, das funktioniert! Die Zellen bleiben leer und der Sort der Datumsfelder funktioniert auch so wie man das gern hätte.

    Vielleicht nicht so ganz koscher ... aber der Zweck heiligt die Mittel. :)

    So bleibt das jetzt! Es sei denn, jemand zeigt mir noch eine Möglichkeit das eleganter zu lösen, OHNE mein Projekt vollkommen neu aufsetzen zu müssen.

    Also Daumen hoch und recht herzlichen Dank für euer Engagement!

    LG
    Peter

    Peter329 schrieb:

    Es sei denn, jemand zeigt mir noch eine Möglichkeit das eleganter zu lösen

    Schau' bitte die Anlage, waren ziemlich genau 10 min. Kann wegen fehlender Informationen ja nur rudimentär sein.
    Dateien