Timespan Troubles in DataGridView

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

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    Timespan Troubles in DataGridView

    Hi,

    ich habe ein Problem mit den Timespans in einer DataGridView.

    Eine Spalte Elapsed soll eine Timespan Variable aufnehmen, die auf volle Minuten gerundet ist.

    Die DataGridView Spalte habe ich als "hh:mm" formatiert, wie ihr der Anlage "Timespan Troubles 1.jpg" entnehmen könnt.

    Die Timespan Variable habe ich (nach vielen Versuchen) wie folgt erfolgreich gerundet:

    VB.NET-Quellcode

    1. Dim ElapsedRounded As TimeSpan = TimeSpan.FromMinutes(Math.Round(tspElapsed.TotalMinutes, MidpointRounding.ToEven))


    Wenn jemandem was Einfacheres einfällt, dann wäre ich für einen Hinweis dankbar. :)

    Danach habe ich die DataGridView in der üblichen Weise befüllt:

    VB.NET-Quellcode

    1. dgvNetLog.Rows.Add(dtsStatsDateNew, ElapsedRounded, intSeconds, InboundPacketRate, OutboundPacketRate)


    Jetzt hätte ich erwartet, dass damit die Timespan im Format hh:mm ausgegeben wird. Tatsächlich erhalte ich aber die Ausgabe gemäß Anhang "Timespan Troubles 2.jpg"

    Wie man sieht, wird vollkommen korrekt gerundet. Aber die Ausgabe erfolgt im Format hh:mm:ss - d.h. die Sekunden werden immer noch angezeigt !

    Was mache ich denn falsch ?

    LG
    Peter
    Bilder
    • Timespan Troubles 1.jpg

      67,24 kB, 486×400, 185 mal angesehen
    • Timestamp Troubles 2.jpg

      25,46 kB, 457×392, 140 mal angesehen

    Peter329 schrieb:

    Was mache ich denn falsch ?
    Datum / Zeit ist DateTime, nicht aber TimeSpan.
    Hatten wir doch gestern erst? ;)
    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!

    RodFromGermany schrieb:

    Datum / Zeit ist DateTime, nicht aber TimeSpan.
    Hatten wir doch gestern erst? ;)


    Jau ... ich erinnere mich dunkel ! :)

    Das hab ich ja auch verstanden. Was ich jetzt wohl neu hinzugelernt habe, der Type "Timespan" wird von der DataGridView nicht unterstützt. Und damit muss ich meine Timespan vorher in irgendetwas anderes konvertieren.

    Was ich weiterhin glaube verstanden zu haben, es gibt nur sehr eingschränkte Möglichkeiten Timespans zu formatieren. Insbesondere "Runden" oder "Abschneiden" einer Timespan sind im Visual Basic ganz unvernünftige Operationen, die gar nicht erst implementiert werden. :)

    Mein Problem hab ich jetzt ganz hausbacken gelöst, indem ich die Daten in einen String umgewandelt habe ... und die Spalte der DataGridView entsprechend angepasst habe:

    VB.NET-Quellcode

    1. Dim strElapsed As String = ""
    2. If tspElapsed.TotalSeconds >= 60 Then
    3. Dim ElapsedRounded As TimeSpan = TimeSpan.FromMinutes(Math.Round(tspElapsed.TotalMinutes, MidpointRounding.ToEven))
    4. strElapsed = ElapsedRounded.ToString.Substring(0, 5)
    5. End If


    Wenn die Timespan weniger als 1 Minute beträgt, dann wird ein Leerstring ausgegeben. Das hätte ich wohl anders nicht hinbekommen. Na, vielleicht haben ja die Spezialisten doch noch eine schlaue Idee.

    Danke auch für den Link zum "Tut" von ErfinderDesRades ... auch wenn mir bei der Syntax der Format Anweisung dann doch gelegentlich die Haare zu Berge stehen. Da werden bei mir Erinnerungen aus der aschgrauen Zeit der Datenverarbeitung wach ... es ist eben auch in der schönen neuen Welt nicht alles Gold was glänzt.

    LG
    Peter

    Peter329 schrieb:

    Und damit muss ich meine Timespan vorher in irgendetwas anderes konvertieren
    Addiere doch den TimeSpan zu einem einheitlichen Start-Datum und konvertiere ihn so in dein DateTime:

    VB.NET-Quellcode

    1. DateTime val = New DateTime(2000, 1, 1) + DEIN_TIME_SPAN

    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!
    Also vielleicht bin ich jetzt (wieder einmal) schwer von Begriff.

    Aber so wie ich deine Lösung verstehe erhalte ich doch nicht das was ich mir vorstelle.

    Ich möchte etwas erhalten, wie z.B.: 00:10 ... um anzuzeigen, dass (gerundet) Elapsed 10 Minuten vergangen sind.

    Bei deiner Lösung erhalte ich doch einen Timestamp, also etwa 15.01.2016 18:30

    Oder hab ich dich jetzt falsch verstanden?

    Peter329 schrieb:

    einen Timestamp
    Jou.
    Wenn allerdings der Start an einem (filtiven aber sinnvollen) Nullpunkt liegt, sind die Ergebnisse auch vernünftig darstellbar.
    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 schrieb:

    Was ich jetzt wohl neu hinzugelernt habe, der Type "Timespan" wird von der DataGridView nicht unterstützt.
    Doch, eiglich schon.

    Aber insofern hast du recht, der gezeigte Dialog lässt Timespan-spezifische Formate vermissen, da muss man dann auf Custom ("Benutzerdefiniert") gehen.
    Jdfs Timespans kann man auch fabelhaft formatieren - da besteht keinerlei prinzipieller Unterschied etwa zu DateTime.
    Es ist halt eine andere Klasse, und da gelten etwas andere Formatstrings, aber vom Prinzip her ists dasselbe.

    Edit: Jetzt probiere ich mit rum, und hab auch Probleme. Also die Anzeige kann ich formatieren, aber meine Eingaben nimmter nicht an.
    Edit: Ich musses halt richtig machen, dann gehts 8o
    zB habich nu CustomFormat hh\:mm und null Problemo

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

    ErfinderDesRades schrieb:


    Edit: Jetzt probiere ich mit rum, und hab auch Probleme. Also die Anzeige kann ich formatieren, aber meine Eingaben nimmter nicht an.
    Edit: Ich musses halt richtig machen, dann gehts 8o
    zB habich nu CustomFormat hh\:mm und null Problemo


    Na gut, wenn selbst der Großmeister der Objektorientierung Probleme mit den Timespans in einer DataGridView hat, dann stimmt mich das insofern hoffnungsfroh, als dass ich vielleicht doch nicht total verblödet bin, wenn ich das nicht so ohne weiteres hinbekomme. :)

    gut ... das freut mich natürlich, dass du jetzt "null problemo" hast ... vielleicht lässt du mich freundlicherweise an deinen bahnbrechenden Erkenntnissen teilhaben. Wie erreiche ich denn jetzt die Formatierung "hh:mm" gerundet für eine Timespan ?

    LG
    Peter
    hab ich doch gesagt: Stell das CustomFormat (alias "Benutzerdefiniert" - in deim Bildle) auf hh\:mm (nicht: hh:mm)

    (übrigens den "Großmeister" lassemermal dahingestellt sein, ich bin jedenfalls genau son Trottel wie alle anderen auch.
    Was ich mir hier ganz gut vor Augen führen konnte, ich hab nämlich zunächt hh\:hh probiert, und das ging irgendwie nicht richtig ;) )

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

    Okie dokie ... das mit dem UserFormat und dem Format String "hh\:mm" klappt hervorragend. Allerding wird nicht gerundet, sondern hart abgeschnitten.

    Man kann die Spalte aber nicht leer lassen ... wenn man die Timespan etwa auf "Nothing" setzt, wird "00:00" angezeigt.

    Will man die TimeSpan nur unter bestimmten Bedingungen ausgeben und ansonsten leer lassen, dann bleibt wohl wirklich nix anderes übrig, als die Spalte als String zu definieren und "händisch" zu verwalten.

    Na, mein Programm läuft jedenfalls jetzt so wie ich mir das vorgestellt habe. Herzlichen Dank an die Ratgeber!

    LG
    Peter

    Peter329 schrieb:

    Will man die TimeSpan nur unter bestimmten Bedingungen ausgeben und ansonsten leer lassen, dann bleibt wohl wirklich nix anderes übrig, als die Spalte als String zu definieren und "händisch" zu verwalten.

    Schaue dir das DGV.CellFormatting-Event einmal an...
    msdn.microsoft.com/de-de/libra…cs-lang=vb#code-snippet-2
    Hier wird nur die Ansicht des Zellwertes geändert, der Wert selber bleibt unberührt...
    Du könntest das Aussehen der Wertausgabe selbst bestimmen und im DGV anzeigen lassen...