Zero suppression for DGV Cell

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Peter329.

    Zero suppression for DGV Cell

    Hi,

    ich habe ein recht einfaches Problem ... bei dem ich trotzdem nicht so recht weiterkomme.

    Ich habe eine DGV, die unter anderem die Decimal Spalten CREDIT und DEBIT beinhaltet. Eine der beiden Spalten ist naturgemäß immer 0 ... und deshalb wäre es wünschenswert, wenn diese Werte nicht angezeigt würden. Das habe ich wie folgt versucht:

    VB.NET-Quellcode

    1. Private Sub DgvAccount_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles DgvAccount.CellPainting
    2. Dim j = e.ColumnIndex
    3. 'Select debit / credit columns
    4. If j = itmAccountCredit.Index OrElse j = itmAccountDebit.Index Then
    5. Dim i = e.RowIndex
    6. If i = -1 Then Exit Sub 'Just to make sure
    7. If DgvAccount.Item(j, i).Value.ToString = "" Then Exit Sub 'Cannot Cint a null string
    8. Dim myValue = CInt(DgvAccount.Item(j, i).Value)
    9. If myValue = 0 Then DgvAccount.Item(j, i).Value = "" 'Zero suppression
    10. End If
    11. End Sub


    Das klappt auch sehr hübsch ... nur habe ich ein Problem. Ich möchte nach diesen Werten auch durch ColumnHeader MouseClick sortieren. Natürlich soll dabei das Format (Decimal) berücksichtig werden.

    Hier scheitere ich aber mit einem Conversion Error, wenn eine Zelle den "NULL-String" enthält.

    Mir fällt keine richtig überzeugende Lösung dazu ein:

    1. Ich schalte um vonSortMode "Automatic" auf SortMode "Programmatic" und schreibe meine eigene Sort Routine. Das sollte zwar funktionieren, scheint mir aber mit Kanonen auf Spatzen geschossen ...

    2. Ich ändere das Format von Decimal auf String - aber dann stimmt natürlich die Sortierreihenfolge nicht mehr .... ich müsste also wieder eine eigene Sort Routine schreiben - das ist dann wohl die "dümmste" Lösung die mir einfallen kann.

    Hat jemand eine zündende Idee, wie man das mit der Zero Suppression einfacher hinbekommen kann ? Ich bin sicher euch fällt etwas viel Besseres ein als mir. :)

    LG
    Peter
    Setz nicht den Inhalt auf Leerstring, sondern setz die Schriftfarbe auf die Hintergrundfarbe.
    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.
    Na, das ist ja genau die richige Idee ... Danke !

    Natürlich muss man auch die "SelectionForecolor" richtig einstellen, damit der Wert nicht beim Selektieren wieder auftaucht. :)

    Allerdings ... es gibt einen Wermutstropfen:

    Wenn man das Mousewheel betätigt, dann blitzen die 0-Werte kurzzeitig auf, weil die Paint Routine einen Moment braucht, um die Zellen zu verarbeiten.

    Deshalb habe ich einfach die Zellen grundsätzlich im Designer "unsichtbar" gemacht und blende sie nur wieder ein, wenn ihr Wert von 0 verschieden ist:

    VB.NET-Quellcode

    1. Private Sub DgvAccount_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles DgvListAccount.CellPainting
    2. Dim j = e.ColumnIndex
    3. 'Select debit / credit columns
    4. If j = itmAccountCredit.Index OrElse j = itmAccountDebit.Index Then
    5. Dim i = e.RowIndex
    6. If i = -1 Then Exit Sub 'Just to make sure
    7. Dim myValue = CInt(DgvListAccount.Item(j, i).Value)
    8. If myValue <> 0 Then
    9. 'Make value visible
    10. DgvListAccount.Item(j, i).Style.ForeColor = Color.White
    11. DgvListAccount.Item(j, i).Style.SelectionForeColor = Color.White
    12. End If
    13. End If
    14. End Sub


    Jetzt blitzt nix mehr auf.

    Leider ist das auch jetzt noch nicht ganz zufriedenstellend.

    Wenn man den Mousezeiger über der Zelle schweben lässt, dann wird der Wert als "Bubble" angezeigt. Ich hab ein Bildchen angehängt und das zu verdeutlichen.

    Kann man diese Bubble noch los werden ? Klar, kann man damit leben ... aber schöner wäre es schon.

    LG
    Peter

    P.S.: Testweise habe ich statt "0" den Wert "nothing" in die DGV eingestellt .... Dann gibt es zwar keine Bubble mehr aber das verlangt dann sofort wieder eine eigene Sortroutine. Weil sonst die 0 nicht zwixhen negativen und positiven Werten eingestellt wird. Und diese SortRoutine würde ich gern vermeiden.
    Bilder
    • s 2023-05-18 23-04-144.jpg

      10 kB, 245×173, 376 mal angesehen

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

    Bei mir werden die nur angezeigt, wenn die Spalte kleiner als der Zellinhalt ist. Aber grundsätzlich kann ich die mit MeinDGV.ShowCellToolTips = False, auch im Designer deaktivieren. Oder soll das Feature grundsätzlich aktiv sein? Was sagt denn DeinDGV(Spaltenindex, Zeilenindex).ToolTipText 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.
    Mit der Eigenschaft .ShowCellToolTips kann ich die Tool Tips komplett ausschalten.

    VB.NET-Quellcode

    1. DgvListAccount.ShowCellToolTips = False



    Die Tooltips will ich auf der DGV aber nicht generell ausschalten - die sind für Textspalten mit langem Inhalt (wie z.B. dem Buchungstext) sehr nützlich. Ich würde das schon gern auf die Spalten Debit und Credit beschränken - denn der Tooltip für eine Decimal Spalte ist ja nicht besonders hilfreich.

    Das hab ich jetzt erst mal Im Designer versucht - das wirkt einfach nicht ! Da kann ich reinschreiben was ich will, es wird nach wie vor der Decimal Betrag angezeigt. (s. Anhang)

    In der Paint Routine hab ich das so versucht:

    VB.NET-Quellcode

    1. DgvListAccount(j, i).ToolTipText = ""


    Aber auch hier ändert sich am Verhalten des Tooltip Text nichts.

    Das hier funktioniert auch nicht:

    VB.NET-Quellcode

    1. DgvListAccount(j, i).showtooltips = False


    weil .showtooltips kein Member der DgvCell ist.

    Irgendwas scheine ich falsch verstanden zu haben. Ich hoffe, ich stelle mich nicht gar zu blöde an.

    LG
    Peter
    Bilder
    • s 2023-05-19 17-41-333.jpg

      38,63 kB, 583×425, 29 mal angesehen

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

    @EDR

    Vielen Dank für den Link. Tatsächlich ist die Sache wie mir scheint "waffenscheinpflichtig". :)

    Ganz offen gestanden, ist mir das dann doch ein bissl zu viel Aufwand .. da lebe ich halt mit dem ToolTip für die unterdrückte Null. Es gibt Schlimmeres ...

    Allein eine Frage hätte ich noch:

    VaporiZed schrieb:

    Bei mir werden die nur angezeigt, wenn die Spalte kleiner als der Zellinhalt ist.


    Das würde mir eigentlich schon völlig reichen ! Dann würden die numerischen Zellen nicht mehr angezeigt ... und damit wäre mein Problem gelöst.

    Nur wrid in meiner DGV der ToolTip grundsätzlich angezeigt. Ich habe keine Ahnung warum das so ist ... wissentlich hab ich das jedenfalls nicht veranlasst. Weiß jemand wie man das einstellen kann?

    LG
    Peter
    Laut Microsoft wird das eh nur unter bestimmten Bedingungen angezeigt. Teste das mal mit dem Projekt im Anhang. Da wird bei mir nach Klicken auf [Button1] das DGV gefüllt, aber nur der Preis in Zeile#3 ist abgeschnitten und wird per ToolTip beim MouseHovern gezeigt. Sonst nix.
    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.
    Danke für den Link .... erfreulicherweise bin ich mit der Darstellung der Date Values völlig zufrieden, so dass ich mich damit nicht weiter befassen muss. :)

    Für alle die es interessiert: Die Zero Suppression durch Wahl der ForeGround=BackGround Color funktioniert prima. Dass die realen Werte durch den ToolTip angezeigt werden, finde ich inzwischen gar nicht so schlecht !

    So sollte man das Problem also lösen. Vielen Dank noch einmal an die Ratgeber ... Daumen hoch ... und einen schönen Tag ...

    LG
    Peter