direckcast gibt fehlermeldung...

  • VB.NET

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

    direckcast gibt fehlermeldung...

    Hallo zusammen,
    ich habe 15 checkboxen und möchte einen wert ausgeben wenn eine oder mehrere checked=true haben.
    folhgenden code habe ich , bekomme da aber folgende fehlermeldung:

    System.NullReferenceException wurde nicht behandelt.
    Message=Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

    das sub rufe ich über einen Button auf.
    chbfw ist public als string deklarirt.

    VB.NET-Quellcode

    1. Public Sub chb115()
    2. For i As Integer = 1 To 15
    3. If DirectCast(Me.Controls("CheckBox" & i.ToString), CheckBox).Checked = True Then
    4. Dim iw As Integer = i - 1
    5. Dim chbfw1 As String = iw.ToString("00")
    6. chbfw = "-" & chbfw1
    7. MsgBox(chbfw)
    8. End If
    9. Next
    10. End Sub
    Du kannst mit

    VB.NET-Quellcode

    1. Dim myObject As DataType = TryCast(source, Type)

    casten, dann stürtzt es nicht ab, da myObject "Nothing" ist, wenn es nicht funktioniert. Dann kannst du das einfach handlen.

    Ansonsten dafür sorgen, dass auf jeden Fall was ankommt (Ich gehe nur davon aus, dass Nothing zurück kommt, wenn ich versuche, Files oder Daten aus DB´s zu laden, was Nothing zurück geben kann, in anderen Fällen hatte ich die Situation noch nicht. Daher deutet dies bei dir auf einen Fehler in der Programmierung hin)

    Ansonsten empfehle ich dir zum Casten meinen Post zum Casting, siehe dazu meine Signatur.
    Null-basierter Index :?:

    VB.NET-Quellcode

    1. For i As Integer = 1 To 15
    ==>

    VB.NET-Quellcode

    1. For i As Integer = 0 To 14
    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 ich habe es mal zu fuß probiert

    VB.NET-Quellcode

    1. Public Sub chb115()
    2. For i As Integer = 1 To 15
    3. Dim chb As New CheckBox
    4. chb.Name = "CheckBox" & i.ToString
    5. Dim cbn As String = chb.Name.ToString
    6. If chb.Checked = True Then
    7. Dim iw As Integer = i - 1
    8. Dim chbfw1 As String = iw.ToString("00")
    9. chbfw = "-" & chbfw1
    10. MsgBox(chbfw)
    11. Else
    12. MsgBox(cbn & " not checked")
    13. End If
    14. Next
    15. End Sub


    nur den status checked fragt er nicht wirklich ab , für alle 15 checkboxen erscheint die messagebox unter else... why
    das mit dem casten klappt gar nichts, die boxen liegen direkt auf dem tabcontrol1 des form nix panel oder so...

    Und so sagt er chb ist kein member von artikel (artikel= der name des Forms )

    VB.NET-Quellcode

    1. Public Sub chb115()
    2. For i As Integer = 1 To 15
    3. Dim chb As New Control
    4. chb.Name = Replace("CheckBox" & i.ToString, " ", "")
    5. Dim cbn As String = chb.Name.ToString
    6. If artikel.chb.Checked = True Then
    7. Dim iw As Integer = i - 1
    8. Dim chbfw1 As String = iw.ToString("00")
    9. chbfw = "-" & chbfw1
    10. MsgBox(chbfw)
    11. Else
    12. MsgBox(cbn & " not checked")
    13. End If
    14. Next
    15. End Sub


    kann es daran liegen das es im TabControl1 liegt und wie spreche ich es dann korrekt an ?

    wenn ich statt artikel - me.tabcontrol1.chb.checked = True Then schreibe kommt
    "chb ist kein Member von systems.windows.forms.tabControl"
    1. chb ist bei dir nur in der Sub sichtbar. Die Deklaration gehört global in die Klasse. In der Schleife dann nur noch chb = New Dingens.
    2. ist das sowieso Blödsinn, weil du doch auf der Form vorhandene Controls befragen möchtest. Oder? Also mußt du die Controls-Auflistung des den Checkboxen übergeordneten Control durchlaufen und dort deine gewünschte Checkbox identifizieren. Oder, um bei picos Bild zu bleiben: Nimm jedes einzelne Ei aus dem Eimer des Autos und schau nach, obs gescheckt ist.
    3. Achte beim Durchlaufen der Controls auf die Typen und Caste dem entsprechend.

    Lösung B: (gefällt mir persönlich besser)
    Deine Checkboxen haben ein Event Checkchanged. In diesem kannst du eine globale Variable() (oder List(Of T) entsprechend setzen oder rücksetzen. Die Auswertesub brauch dann nur dieses Array durchlaufen.

    Fiel Fergnügen

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Hast Du inzwischen ein Stück Code, das sich anders / besser verhält, als Deine ursprüngliche Variante?
    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!
    So habs gelöst nach langer suche ...
    nicht nur auto.eimer.ei sondern auch noch wo im auto handschufach oder kofferraum

    VB.NET-Quellcode

    1. Public Sub chb115()
    2. Try
    3. For i As Integer = 1 To 15
    4. chb.Name = Replace("CheckBox" & i.ToString, " ", "")
    5. Dim cbn As String = chb.Name.ToString
    6. If DirectCast(TabControl1.SelectedTab.Controls(cbn), CheckBox).Checked = True Then
    7. 'If chb.Checked = True Then
    8. Dim iw As Integer = i - 1
    9. Dim chbfw1 As String = iw.ToString("00")
    10. MsgBox(chbfw)
    11. Else
    12. MsgBox(cbn & " not checked")
    13. End If
    14. Next
    15. Catch ex As Exception
    16. MsgBox("Problem" & vbCrLf & ex.Message)
    17. End Try
    18. End Sub

    ronaldl schrieb:

    sondern auch noch wo im auto handschufach oder kofferraum
    Das haste nicht ganz verstanden. :D
    Dein Code lässt sich noch etwas verbessern:

    VB.NET-Quellcode

    1. Public Sub chb115()
    2. For i As Integer = 1 To 15
    3. Dim cbn As String = "CheckBox" & i.ToString
    4. If DirectCast(TabControl1.SelectedTab.Controls(cbn), CheckBox).Checked = True Then
    5. Dim chbfw1 As String = (i - 1).ToString("00")
    6. MsgBox(chbfw1)
    7. Else
    8. MsgBox(cbn & " not checked")
    9. End If
    10. Next
    11. 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!