Konvertierung?!? Wer kann helfen? Option Strict Off

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von NoIde.

    Konvertierung?!? Wer kann helfen? Option Strict Off

    Hallo!

    Ich möchte direkt auf eine Zelle in einem Datagridview zugreifen..habe daher folgende Zeile:

    VB.NET-Quellcode

    1. Dim foundCell As DataGridViewCell = (From row As DataGridViewRow In _dgv.Rows, cell As DataGridViewCell In row.Cells Where cell.Value.ToString.Contains(i.ToString) Select cell).First


    Jedoch läuft die Zeile nur wenn ich Option Strict Off arbeite!

    Er bemängelt die Konvertierung von Object zu DataGridViewCell!

    Was muss ich ändern?!?

    Morrison schrieb:

    Er bemängelt die Konvertierung von Object zu DataGridViewCell!
    Die Zeile ist recht lang, geh mit der Maus über alle Variablen, im HOver bekommst Du angezeigt, was das ist, und wenn Du alles korrekt konvertierst / castest, geht es dann auch mit Strict On.
    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!
    Leider kann ich das Problem nicht nachvollziehen. Bei mir wird ohne Typangabe von foundCell per Option Infer der korrekte Datentyp erkannt. Er wurde ja auch in der RHS-Anweisung explizit mit As DataGridViewCell angegeben. Aber selbst mit Typangabe schnurrt das ganze. Klar, mein DGV heißt DataGridView1 und ich hab nen konkreten String reingemacht (aber das hab ich bleistiftsweise natürlich auch mal mit i As Integer = 1 und dann ToString() probiert; klappt natürlich auch). Aber sonst: Nix anderes.


    btw: Ich geh mal davon aus, dass Du nen guten Grund hast, im DGV statt in einer evtl. gebundenen DataSource zu suchen.
    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.
    Das einzige, was ich mit dem Projekt beim Erstellen bekomme, sind 2 Warnungen: 1>C:\Users\Zed\Desktop\Urlaubskalender_01\Form1.vb(305,173): warning BC42327: Die Verwendung der Iterationsvariablen in einem Abfrageausdruck kann zu unerwarteten Ergebnissen führen. Erstellen Sie stattdessen in der Schleife eine lokale Variable, und weisen Sie dieser den Wert der Iterationsvariablen zu.
    Wenn ich dem Hinweis nachgebe, gibt das gute Stück Ruhe.
    Ich hab VS 2017 CE
    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.
    Es geht um diese Funktion:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub _TageMarkieren(ByVal _dgv As DataGridView)
    2. If _startingCell IsNot Nothing AndAlso _endingCell IsNot Nothing Then
    3. Debug.WriteLine(_startingCell.Value.ToString & " - " & _endingCell.Value.ToString)
    4. If CInt(_startingCell.Value) < CInt(_endingCell.Value) Then
    5. For i As Integer = CInt(_startingCell.Value) To CInt(_endingCell.Value)
    6. Dim foundCell As DataGridViewCell = (From row As DataGridViewRow In _dgv.Rows, cell As DataGridViewCell In row.Cells Where cell.Value.ToString.Contains(i.ToString) Select cell).First
    7. If foundCell.Selected = True Then
    8. foundCell.Selected = False
    9. Else
    10. foundCell.Selected = True
    11. End If
    12. Next
    13. Else
    14. [b]For i As Integer = CInt(_endingCell.Value) To CInt(_startingCell.Value)
    15. Dim foundCell As DataGridViewCell = (From row As DataGridViewRow In _dgv.Rows, cell As DataGridViewCell In row.Cells Where cell.Value.ToString.Contains(i.ToString) Select cell).First[/b]
    16. If foundCell.Selected = True Then
    17. foundCell.Selected = False
    18. Else
    19. foundCell.Selected = True
    20. End If
    21. Next
    22. End If
    23. 'End If
    24. End If
    25. End Sub



    Diese soll in einem DGV einen Bereich von Zellen markieren die vorher bestimmt wurden startingCell und endingCell.

    @VaporiZed: Und bei Dir bemängelt er wohl diesen Bereich:

    VB.NET-Quellcode

    1. For i As Integer = CInt(_endingCell.Value) To CInt(_startingCell.Value)
    2. Dim foundCell As DataGridViewCell = (From row As DataGridViewRow In _dgv.Rows, cell As DataGridViewCell In row.Cells Where cell.Value.ToString.Contains(i.ToString) Select cell).First

    Also deine Zeile funktioniert so mit OptionStrict.

    VB.NET-Quellcode

    1. Dim foundCell As DataGridViewCell = (From row As DataGridViewRow In DataGridView1.Rows.Cast(Of DataGridViewRow)(), cell As DataGridViewCell In row.Cells.Cast(Of DataGridViewCell)() Where cell.Value.ToString().Contains(i.ToString) Select cell).First()


    Warum hier nicht anstatt

    VB.NET-Quellcode

    1. If foundCell.Selected = True Then
    2. foundCell.Selected = False
    3. Else
    4. foundCell.Selected = True
    5. End If
    , einfach nur foundCell.Selected = Not foundCell.Selected?
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    @Morrison: Ich hab zwar jetzt gesehen, welchen Bereich Du meintest (im Code kann man leider keine Stylings wie bold machen), aber das ist doch Jacke wie Hose. Ist doch grundsätzlich der gleiche Code. Ich bekomm 2 Warnungen, eine für Zeile 7 und eine für Zeile 16. Aber lauffähig bleibt es dennoch.
    btw: Warum nicht einfach alles zu einem Stück zusammenschmelzen, indem Du z.B. sowas verwendest:

    VB.NET-Quellcode

    1. Dim StartValue = If(CInt(_startingCell.Value) < CInt(_endingCell.Value), CInt(_startingCell.Value), CInt(_endingCell.Value))
    2. Dim EndValue = If(CInt(_startingCell.Value) > CInt(_endingCell.Value), CInt(_startingCell.Value), CInt(_endingCell.Value))

    Dann kannst Du Dir die doppelte For-Schleife sparen. Oder man setzt einen passenden Step-Wert bei der For-Schleife (1 als normal, aber wenn CInt(_startingCell.Value) > CInt(_endingCell.Value), dann Step -1)

    noch was: Ist sicherlich ne Glaubensfrage, aber warum eine Sub aus einem riesigen If-Block bestehen lassen? Ich mach es immer so, dass die Sub verlassen wird, wenn die Startbedingungen nicht zutreffen.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub _TageMarkieren(ByVal _dgv As DataGridView)
    2. If _startingCell Is Nothing OrElse _endingCell Is Nothing Then Exit Sub
    3. Dim StartValue = If(CInt(_startingCell.Value) < CInt(_endingCell.Value), CInt(_startingCell.Value), CInt(_endingCell.Value))
    4. Dim EndValue = If(CInt(_startingCell.Value) > CInt(_endingCell.Value), CInt(_startingCell.Value), CInt(_endingCell.Value))
    5. Debug.WriteLine(StartValue.ToString & " - " & EndValue.ToString)
    6. For i = StartValue To EndValue
    7. Dim foundCell = (From row As DataGridViewRow In _dgv.Rows, cell As DataGridViewCell In row.Cells Where cell.Value.ToString.Contains(i.ToString) Select cell).First
    8. foundCell.Selected = Not foundCell.Selected
    9. Next
    10. End Sub


    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 2 mal editiert, zuletzt von „VaporiZed“ ()

    Vielen Dank für den kürzeren Code!! 8o

    Jedoch bekomme ich nach wie vor die gleiche Fehlermeldung!
    Implizite Umwandlung von Object zu DataGridViewCell nicht möglich!

    Außerdem jedoch noch "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt." X/
    Bilder
    • Error1.jpg

      265,9 kB, 1.280×720, 171 mal angesehen
    • Error2.jpg

      262,2 kB, 1.280×720, 167 mal angesehen
    • Error3.jpg

      186,88 kB, 1.280×720, 152 mal angesehen
    Ich sehe in deinem Code auch nicht das .Cast verwendet wird.

    VB.NET-Quellcode

    1. Dim foundCell As DataGridViewCell = (From row As DataGridViewRow In DataGridView1.Rows.Cast(Of DataGridViewRow)(), cell As DataGridViewCell In row.Cells.Cast(Of DataGridViewCell)() Where cell.Value.ToString().Contains(i.ToString) Select cell).First()
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    probierma

    VB.NET-Quellcode

    1. Private Sub TageMarkieren(dgv As DataGridView)
    2. If _startingCell Is Nothing OrElse _endingCell Is Nothing Then Exit Sub
    3. Dim valueRange = {CInt(_startingCell.Value), CInt(_endingCell.Value)}
    4. If valueRange(0) > valueRange(1) Then valueRange = {valueRange(1), valueRange(0)}
    5. For x = 0 To dgv.ColumnCount - 1
    6. For y = 0 To dgv.RowCount - 1
    7. Dim cell = dgv(x, y)
    8. Dim value = CInt(cell.Value)
    9. cell.Selected = valueRange(0) <= value AndAlso value <= valueRange(1)
    10. Next
    11. Next
    12. End Sub
    Man muss nicht alles mit Linq lösen

    ErfinderDesRades schrieb:

    Man muss nicht alles mit Linq lösen
    Genau das liegt mir am Herzen.
    @Morrison Mach LINQ wenn Du es kannst, nicht aber wenn es nur schnuckelig aussieht.
    Ich bin kein großer LINQ-Könner.
    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!
    Jaa, das ".cast" war es!! Danke! :thumbsup:

    Jetzt muss ich nur noch sehen wieso er jetzt auf einmal "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt." schmeisst! :(

    Wobei die Sub von @ErfinderDesRades funzt! :/

    Hab gelesen das die meisten WinForms.Controls das "IEnumerable<T> Interface" nicht implementieren und man deshalb des .cast benutzen muss und man besser mit einem DataTable anstelle des Controls arbeiten soll!!

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

    Die Value einer Cell wird da wohl nothing sein. Sollte eine weitere Bedingung rein, dann solte es auch damit gehen.

    VB.NET-Quellcode

    1. Dim foundCell As DataGridViewCell = (From row As DataGridViewRow In DataGridView1.Rows.Cast(Of DataGridViewRow)(), cell As DataGridViewCell In row.Cells.Cast(Of DataGridViewCell)() Where cell.Value IsNot Nothing AndAlso cell.Value.ToString().Contains(i.ToString) Select cell).First()

    Wobei das immer unübersichtlicher wird.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin