DGV - Probleme bei Typkonvertierung

  • VB.NET

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

    DGV - Probleme bei Typkonvertierung

    Hallo,

    ich habe eine bescheidene Frage bezüglich eines DGVs und finde irgendwie nicht die passende Antwort bzw. komme nicht auf die Lösung.

    Ich möchte den Inhalt verschiedener Zeilen in einem DGV löschen, wenn der Wert überschritten wurde. Das Ganze sieht momentan so aus:

    VB.NET-Quellcode

    1. For z = 0 To DataGridView2.Columns.Count - 1
    2. For w = 0 To DataGridView2.Rows.Count - 1
    3. If DataGridView2.Item(z, w).Value > 1000.0 Then
    4. DataGridView2.Rows.RemoveAt(w)
    5. End If
    6. Next
    7. Next


    Nun bekomme ich logischerweise den Fehler:
    Fehler BC30038 "Option Strict On" lässt keine Operanden des Typs "Object" für den >-Operator zu.

    Aber wie kann ich den Typ konvertieren? .ToString ist an der Stelle blöd, da ich ja keinen String habe, sondern Zahlen im Double-Format.

    Ich hatte dazu diesen Thread gefunden, aber er hilft mir nicht weiter:
    DataGridView mit txt vergleichen
    If CDbl(DataGridView2.Item(z, w).Value) > 1000.0 Then
    Möge sich kein Text oder Bild in der DGV-Zelle befinden …
    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.
    @Murdersquad Auch wenn die Value-Property vom Typ Object ist, kannst Du deren hinterlegten Typ abfragen:

    VB.NET-Quellcode

    1. Sub Test()
    2. Dim value As Object = 1.2
    3. 'Dim value As Object = "1.2"
    4. If TypeOf (value) Is Double Then
    5. MessageBox.Show("Double")
    6. Else
    7. MessageBox.Show(value.GetType.ToString())
    8. End If
    9. End Sub

    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!
    @VaporiZed
    Das ist das was ich gesucht habe, da stand ich wohl neben mir. Es stehen auch nur Zahlen drinne, da es so etwas wie Messwerte sind.

    @RodFromGermany
    Den Typ weiß ich ja, ich war mir nur nicht sicher, wie ich es konvertieren kann.

    @ErfinderDesRades
    Also die Werte wollte ich wirklich aus der Anzeige entfernen. Es sind auch bereits gefilterte Daten, da hinter dem DGV eine MySQL-DB liegt.

    Aber danke euch, dadurch hat sich wieder etwas in mein Hirn eingebrannt.
    Jetzt habe ich noch ein wenig umhergespielt und wollte den Titel der Spalte um 90° drehen. Da hatte ich vor längerer Zeit schon mal untenstehenden Codeschnipsel gefunden.
    Wenn ich ein neues Projekt mit einem DGV anlege, dann ist alles in Ordnung, im bestehenden Projekt haut er mir folgende Fehler raus:

    Fehler BC30574 "Option Strict On" lässt spätes Binden nicht zu.
    Fehler BC30574 "Option Strict On" lässt spätes Binden nicht zu.
    Fehler BC30311 Der Wert vom Typ "Rectangle" kann nicht in "Rectangle" konvertiert werden.

    Der Fehler mit dem Binden bezieht sich auf "New PointF(rect.Y, rect.X))" und scheint mir nur ein Folgefehler zu sein.
    Der Konvertierungsfehler kommt aus der Zeile "Dim rect As Rectangle ...", aber macht aus meiner Sicht gar keinen Sinn.
    Wie kommt es, dass dies als Fehler angemeckert wird? Habe ich irgendeine blöde Projekteinstellung?

    VB.NET-Quellcode

    1. Private Sub dataGridView2_CellPainting(ByVal sender As Object, ByVal e As DataGridViewCellPaintingEventArgs) Handles DataGridView2.CellPainting
    2. If e.RowIndex = -1 AndAlso e.ColumnIndex >= 0 Then
    3. e.PaintBackground(e.ClipBounds, True)
    4. Dim rect As Rectangle = DataGridView2.GetColumnDisplayRectangle(e.ColumnIndex, True)
    5. Dim titleSize As Size = TextRenderer.MeasureText(e.Value.ToString(), e.CellStyle.Font)
    6. If Me.DataGridView2.ColumnHeadersHeight < titleSize.Width Then Me.DataGridView2.ColumnHeadersHeight = titleSize.Width
    7. e.Graphics.TranslateTransform(0, titleSize.Width)
    8. e.Graphics.RotateTransform(-90.0F)
    9. e.Graphics.DrawString(e.Value.ToString(), Me.Font, Brushes.DarkGoldenrod, New PointF(rect.Y, rect.X))
    10. e.Graphics.RotateTransform(90.0F)
    11. e.Graphics.TranslateTransform(0, -titleSize.Width)
    12. e.Handled = True
    13. End If
    14. End Sub

    ErfinderDesRades schrieb:

    Ich glaub, da steht was anderes
    Ich glaube das nicht. GetColumnDisplayRectangle gibt ein System.Drawing.Rectangle zurück, kein System.Drawing.RectangleF. Wahrscheinlich ist, dass es durch importierte Namespaces 2 Rectangle-Typen gibt.
    @Murdersquad: Zeig mal mit dem Mauscursor auf Rectangle in Dim rect As Rectangle, dann wird gezeigt, welchen Namespace/Typ der Compiler vermutet. Notfalls schreib:

    VB.NET-Quellcode

    1. Dim rect As System.Drawing.Rectangle = DataGridView2.GetColumnDisplayRectangle(e.ColumnIndex, True)
    2. 'oder
    3. Dim rect = DataGridView2.GetColumnDisplayRectangle(e.ColumnIndex, True)

    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.