Zur Laufzeit erzeugte Panels in einer TableLayoutPanel, Labels einfügen

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von newbie.

    Zur Laufzeit erzeugte Panels in einer TableLayoutPanel, Labels einfügen

    Hallo Spezis,

    Zur Laufzeit erzeuge ich in einem TableLayoutPanel diverse Panels, die bekommen unterschiedliche Farben und Inhalte deswegen dieser Weg.
    Desweiteren wird aus einer DataTable Personeninformationen gelesen und eine ComboBox in einem Panel erzeugt und mit den Nachnamen gefüllt.
    Das funktioniert bis dahin tadellos.

    VB.NET-Quellcode

    1. Private Sub ComboBox_setzen()
    2. Dim cbx As ComboBox
    3. For i As Integer = 1 To 8
    4. cbx = New ComboBox
    5. With cbx
    6. .Name = "cbxIH_" & i
    7. .Dock = DockStyle.Fill
    8. .Font = New Font("Arial", 12)
    9. End With
    10. For Each row As DataRow In myds.Tables(0).Rows
    11. If i <= 3 Then ' Elektriker
    12. If row.Item(3).ToString.Substring(0, 2) = "EW" Then
    13. cbx.Items.Add(row.Item(1))
    14. End If
    15. Else ' i >= 4 --> Schlosser
    16. If row.Item(3).ToString.Substring(0, 2) = "SP" Then
    17. cbx.Items.Add(row.Item(1))
    18. End If
    19. End If
    20. Next
    21. Dim myPanel As Control = TLP_Plan.GetControlFromPosition(i, 1)
    22. myPanel.Controls.Add(cbx)
    23. AddHandler cbx.SelectedIndexChanged, AddressOf Combobox_Auswahl
    24. Next
    25. End Sub


    Nun wenn ich einen Namen aus dieser ComboBox auswähle, soll in dem Panel dadrüber der Vorname in einem Label erscheinen.

    VB.NET-Quellcode

    1. Private Sub Combobox_Auswahl(sender As Object, e As System.EventArgs)
    2. AktuellesObj = CType(sender, ComboBox).Text
    3. AktuellePos = CType(sender, ComboBox)
    4. Dim foundRows() As Data.DataRow
    5. Dim mytable As DataTable = myds.Tables(0)
    6. foundRows = mytable.Select("Nachname LIKE '" & AktuellesObj.ToString & "'")
    7. Dim lbl_Vor As Label
    8. lbl_Vor = New Label
    9. With lbl_Vor 'Vorname
    10. .Name = "lbl_" & AktuellesObj.ToString
    11. .Text = foundRows(0).Item(2).ToString
    12. .Dock = DockStyle.Fill
    13. .TextAlign = ContentAlignment.MiddleLeft
    14. .Font = New Font("Arial", 12)
    15. .AutoSize = False
    16. End With
    17. 'Ab dieser Stelle will es nicht mehr. Was mach ich falsch?
    18. Dim panelname = AktuellePos.Parent.Name.ToString
    19. Dim panelnameint = CInt(Strings.Right(panelname, 1)) - 1
    20. Dim myPanelVorname As New Panel
    21. myPanelVorname = Nothing
    22. myPanelVorname.Name = Replace(panelname, Strings.Right(panelname, 1), CStr(panelnameint)) 'Hier fliegt der es raus mit: "NullReferce Exception"
    23. myPanelVorname.Controls.Add(lbl_Vor)
    24. End Sub


    Ich hoffe mir kann geholfen werden ^^
    Ich bin jetzt mal kein Spezi, sondern ein absoluter Anfänger.
    Meine Vermutung liegt in Zeile 21. Da setzt Du myPanelVorname auf Nothing.
    Eine Zeile später willst du von Nothing den .Name haben.

    Ist myds ein DataSet? ​myds.Tables(0) scheint untypisiert zu sein.
    Ja das stimmt...
    Wenn ich das so schreibe....

    VB.NET-Quellcode

    1. Dim myPanelVorname As Control
    2. myPanelVorname.Name = panelname
    3. myPanelVorname.Controls.Add(lbl_Vor)

    bekomme ich das...

    Quellcode

    1. BC42104: Die myPanelVorname-Variable wird verwendet, bevor ihr ein Wert zugewiesen wird. Zur Laufzeit kann eine Nullverweisausnahme auftreten.


    ​Ist mydsein DataSet? myds.Tables(0) scheint untypisiert zu sein.

    Ja ist es...das funktioniert so, DS wird von einer xml Datei gefüttert.
    Fügen wir Deinen und Akanels Vorschlag zusammen, erhalten wir

    VB.NET-Quellcode

    1. Dim myPanelVorname As New Panel 'NEUES Panel anlegen
    2. myPanelVorname.Name = Replace(panelname, Strings.Right(panelname, 1), CStr(panelnameint)) 'diesem neu angelegtem Panel einen neuen Namen verpassen
    3. myPanelVorname.Controls.Add(lbl_Vor) 'dem neuen Panel ein Control hinzufügen

    Dann kommt was sinnvolles dabei raus. Ob es das ist, was Du willst, musst Du schauen.
    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.
    Ich habe es noch mal versucht etwas zu verbessern...

    VB.NET-Quellcode

    1. Dim panelname = AktuellePos.Parent.Name.ToString
    2. panelname = Replace(panelname, "1", "0")
    3. Dim myPanelVorname As Control = Controls(panelname) 'Es soll natürlich kein neuer Control, sondern das bereits vorhandene angesprochen werden
    4. If myPanelVorname.GetType Is GetType(Panel) Then ' Der Control wird als Panel erkannt, weil die IF Anweisung ein True gibt
    5. myPanelVorname.Controls.Add(lbl_Vor) ' Es fliegt mit NullReferenceException aus der kurve
    6. End If


    warum klappt das nicht? Mit den ComboBoxen klappt das ja auch auf dieser Weise...

    VB.NET-Quellcode

    1. Dim myPanel As Control = TLP_Plan.GetControlFromPosition(i, 1)
    2. myPanel.Controls.Add(cbx)


    Nochmal kurz zur Verdeutlichung des Problems TableLayoutPanel --> Panel in den Zellen --> Label in einem bestimmtem Panel einfügen.

    Was übersehe ich?


    Edit
    Jetzt habe ich es gesehen....

    VB.NET-Quellcode

    1. Dim myPanelVorname As Control = Controls(panelname)


    Lösung...

    VB.NET-Quellcode

    1. Dim myPanelVorname As Control = TableLayoutPanel.Controls(panelname)


    Danke für die Unterstützung

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