[WinForms] Control (TabControl) mit Selektierung über Name ist Nothing

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von nicerdicer.

    [WinForms] Control (TabControl) mit Selektierung über Name ist Nothing

    Hallo,

    ich habe in meiner Windows Form eine TabControl, die zu Beginn noch leer ist und während der Runtime gefüllt werden soll.
    Soweit so gut...Ich füge also meiner Form zuerst die TabPages hinzu, mit folgendem Sub:



    VB.NET-Quellcode

    1. ​Private Sub AddTabs()
    2. Dim add As Boolean = True
    3. Dim tb As New TabPage()
    4. Try
    5. For Each s As String In ds.tabPages
    6. tb.Name = s
    7. tb.Text = s
    8. tb.AllowDrop = True
    9. For Each t As TabPage In tabCtrl.TabPages
    10. If t.Name = Text Then
    11. add = False
    12. End If
    13. Next
    14. If add = True Then
    15. AddHandler tb.DragEnter, AddressOf tb_DragEnter
    16. AddHandler tb.DragDrop, AddressOf tb_DragDrop
    17. tabCtrl.TabPages.Add(tb)
    18. tabCtrl.TabPages(tb.Text).BackColor = Color.White
    19. End If
    20. Next
    21. Catch ex As Exception
    22. MessageBox.Show(ex.Message)
    23. End Try
    24. End Sub


    Die Schleife ist da um zu prüfen, ob die TabPage bereits vorhanden ist, da

    VB.NET-Quellcode

    1. ​tabctrl.TabPages.Contains(tb)
    nie True zurückgegeben hat..nunja andere Baustelle.

    Nun habe ich eine andere Funktion die den Rest der Controls zur jeweiligen TabPage hinzufügen soll.
    Dies versuche ich folgendermaßen zu bewerkstelligen:

    VB.NET-Quellcode

    1. ​Private Sub AddShortcuts()
    2. Try
    3. Dim newCont As New PictureBox()
    4. Dim newLab As New Label()
    5. Dim fs As FileStream
    6. Dim count As Integer = 0
    7. Dim startX As Integer = 0
    8. Dim startY As Integer = 0
    9. For c = 0 To ds.tabPagesWithNames.Keys.Count - 1
    10. Dim n As String = ds.tabPagesWithNames.Keys(c)
    11. For i = 0 To ds.tabPagesWithNames(ds.tabPagesWithNames.Keys(c)).Count - 1
    12. Dim currthumb As String = ds.tabPagesWithThumbs(ds.tabPagesWithNames.Keys(c)).Item(i)
    13. Dim currname As String = ds.tabPagesWithNames(ds.tabPagesWithNames.Keys(c)).Item(i)
    14. Dim currlink As String = ds.tabPagesWithLinks(ds.tabPagesWithNames.Keys(c)).Item(i)
    15. If currthumb = "" Then
    16. fs = New FileStream(path, FileMode.Open, FileAccess.Read)
    17. Else
    18. fs = New FileStream(currthumb, FileMode.Open, FileAccess.Read)
    19. End If
    20. With newCont
    21. .Name = n
    22. .Tag = currlink
    23. .AccessibleName = currname
    24. .BackgroundImage = Image.FromStream(fs)
    25. .BackgroundImageLayout = ImageLayout.Stretch
    26. .Size = New Point(60, 60)
    27. .BorderStyle = BorderStyle.Fixed3D
    28. .Location = New Point(startX, startY + 15)
    29. End With
    30. With newLab
    31. .Tag = currlink
    32. .Location = New Point(startX, startY)
    33. .Text = currname
    34. .Size = New Point(60, 20)
    35. End With
    36. AddHandler newCont.MouseClick, AddressOf newCont_MouseClick
    37. AddHandler newCont.MouseHover, AddressOf newCont_MouseHover
    38. AddHandler newCont.MouseLeave, AddressOf newCont_MouseLeave
    39. '############Hier tritt der Fehler auf############
    40. tabCtrl.TabPages(n).Controls.Add(newCont)
    41. tabCtrl.TabPages(n).Controls.Add(newLab)
    42. If startX < 240 Then
    43. startX = startX + 60
    44. Else
    45. startX = 0
    46. startY = startY + 75
    47. End If
    48. If startY >= Me.Height - 80 Then
    49. Me.Height = Me.Height + 75
    50. tabCtrl.Height = tabCtrl.Height + 75
    51. End If
    52. count += 1
    53. Next
    54. Next
    55. Catch ex As Exception
    56. MsgBox(ex.Message)
    57. End Try
    58. End Sub


    Dabei ist "newCont" eine PictureBox und "newLab" ein Label.
    "n" ist einfach nur ein String der den Namen der TabPage enthält.

    Beim Versuch die Controls hinzuzufügen bekomme ich aber die Meldung dass tabCtrl.TabPages(n) Nothing ist.

    Bei meiner vorherigen Methode die TabPages und die zugehörigen Controls hinzuzufügen hatte ich keine Probleme(folgender Sub in Schleife aufgerufen):

    VB.NET-Quellcode

    1. ​Public Sub AddControls(ByVal text As String, ByVal thumbs As List(Of String), ByVal links As List(Of String), ByVal name As List(Of String))
    2. 'Add TabControls
    3. Dim count As Integer = 0
    4. Dim startX As Integer = 0
    5. Dim startY As Integer = 0
    6. Dim add As Boolean = True
    7. Dim tb As New TabPage()
    8. tb.Name = text
    9. tb.Text = text
    10. tb.AllowDrop = True
    11. For Each t As TabPage In tabCtrl.TabPages
    12. If t.Name = text Then
    13. add = False
    14. End If
    15. Next
    16. If add = True Then
    17. AddHandler tb.DragEnter, AddressOf tb_DragEnter
    18. AddHandler tb.DragDrop, AddressOf tb_DragDrop
    19. tabCtrl.TabPages.Add(tb)
    20. tabCtrl.TabPages(text).BackColor = Color.White
    21. End If
    22. For Each s As String In thumbs
    23. Dim newCont As New PictureBox()
    24. Dim newLab As New Label()
    25. Dim fs As FileStream
    26. If s = "" Then
    27. fs = New FileStream(path, FileMode.Open, FileAccess.Read)
    28. Else
    29. fs = New FileStream(s, FileMode.Open, FileAccess.Read)
    30. End If
    31. With newCont
    32. .Name = text
    33. .Tag = links(count)
    34. .AccessibleName = name(count)
    35. .BackgroundImage = Image.FromStream(fs)
    36. .BackgroundImageLayout = ImageLayout.Stretch
    37. .Size = New Point(60, 60)
    38. .BorderStyle = BorderStyle.Fixed3D
    39. .Location = New Point(startX, startY + 15)
    40. End With
    41. With newLab
    42. .Tag = links(count)
    43. .Location = New Point(startX, startY)
    44. .Text = name(count)
    45. .Size = New Point(60, 20)
    46. End With
    47. AddHandler newCont.MouseClick, AddressOf newCont_MouseClick
    48. AddHandler newCont.MouseHover, AddressOf newCont_MouseHover
    49. AddHandler newCont.MouseLeave, AddressOf newCont_MouseLeave
    50. ''###########Hier tritt kein Fehler auf##############
    51. tabCtrl.TabPages(text).Controls.Add(newCont)
    52. tabCtrl.TabPages(text).Controls.Add(newLab)
    53. If startX < 240 Then
    54. startX = startX + 60
    55. Else
    56. startX = 0
    57. startY = startY + 75
    58. End If
    59. If startY >= Me.Height - 80 Then
    60. Me.Height = Me.Height + 75
    61. tabCtrl.Height = tabCtrl.Height + 75
    62. End If
    63. count += 1
    64. Next
    65. End Sub


    Verstehe wirklich nicht was das Problem ist..und hoffe mein Beitrag ist nicht zu unübersichtlich.

    Gruß
    nicerdicer
    Willkommen im Forum. :thumbup:

    nicerdicer schrieb:

    VB.NET-Quellcode

    1. ​tabctrl.TabPages.Contains(tb)
    fragt ab, ob die Instanz der TabPage bereits enthalten ist.
    Wenn Du fragen möchtest, ob es eine TabPage mit einem bestimmten Titel da ist, musst Du speziell danach fragen.

    VB.NET-Quellcode

    1. Dim tb As New TabPage()
    erstellt genau eine Instanz einer TabPage, die bei jedem Schleifenumlauf einen neuen Namen und einen neuen Text bekommt.
    Wenn das jedes Mal eine neue TabPage sein soll, musst Du diese Zeile in die For-Schleife hinein nehmen.
    Ich denke, Du musst Dir erst mal etwas Verständnis für Objekte und Instanzen aneignen, dann sollte Dein Problem gelöst sein.
    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!