Как я могу динамически добавить вкладку в tabcontrol и добавить метку на вкладку

Я пытаюсь добавить несколько вкладок в существующий TabControl с именем EMER_AUTO_TabContorl и управляемый emer_num_textbox.

Как показано на рисунке ниже, я должен получить группу A/группу B/группу C, но группу C/группу B/группу C.

введите здесь описание изображения

И это мой код.

Dim group_name As String() = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J"} 'my group name
Dim mytabPage As TabPage = New TabPage 
Dim myLabel As Label = New Label
Dim emer_groupNum As Integer 'my input number
Try
        emer_groupNum = Emer_Num_TextBox.Text 
        EMER_AUTO_TabControl.TabPages.Clear() 'Clear my tabControl
Catch           
End Try

For i = 1 To emer_groupNum

   With myLabel
       .Text = "123"
       .Location = New Point(6, pos1_Y)
   End With

   With mytabPage
      .Text = group_name(i - 1) & " Group"         
      .Controls.Add(myLabel)
   End With

   EMER_AUTO_TabControl.TabPages.Add(mytabPage)               
Next

Помимо текста метки 123, он не отображается на вкладках.


person DoubleTian    schedule 15.07.2020    source источник
comment
Попробуйте для начала отладить свой код. Если вы не отлаживали - устанавливали точки останова и выполняли код, а не просто запускали его - то вам не следует писать здесь. Если вы выполнили отладку, у вас должно быть больше информации для предоставления. Кроме того, если вы планируете добавить более одного TabPage к вашему TabControl, не нужно ли вам создавать более одного TabPage? Сколько TabPages вы создаете?   -  person jmcilhinney    schedule 15.07.2020
comment
Переключитесь с TextBox на элемент управления NumericUpDown. Затем вы можете установить минимум на 0 и максимум на длину массива. Теперь у вас всегда будет действительный номер, который находится в пределах требуемого диапазона.   -  person Idle_Mind    schedule 15.07.2020


Ответы (3)


Вы повторно используете одну и ту же вкладку и ярлык каждый раз. Переместите «Новый» внутри цикла for, как показано ниже:

Dim group_name As String() = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J"} 'my group name
Dim mytabPage As TabPage 
Dim myLabel As Label 
Dim emer_groupNum As Integer 'my input number
Try
        emer_groupNum = Emer_Num_TextBox.Text 
        EMER_AUTO_TabControl.TabPages.Clear() 'Clear my tabControl
Catch           
End Try

For i = 1 To emer_groupNum
   myLabel = New Label
   With myLabel
       .Text = "123"
       .Location = New Point(6, pos1_Y)
   End With

   mytabPage = New TabPage
   With mytabPage
      .Text = group_name(i - 1) & " Group"         
      .Controls.Add(myLabel)
   End With

   EMER_AUTO_TabControl.TabPages.Add(mytabPage)               
Next

ИЗМЕНИТЬ

Вы также можете изменить способ проверки правильности целочисленного ввода, так как с Try/Catch в настоящее время цикл For выполняется независимо. Может быть, попробуйте что-то вроде этого:

   If Integer.TryParse(Emer_Num_TextBox.Text, emer_groupNum) Then
        For i = 1 To emer_groupNum
            ' Loop code here
        Next
    Else
        ' Handle incorrect input
    End If
person Jon Roberts    schedule 15.07.2020

Включите Option Strict.

Вы должны проверить с помощью .TryParse, есть ли в текстовом поле строка, которую можно преобразовать в целое число.

Никогда не пишите пустой Catch. Ваш код просто проглотит ошибки, и вы не будете знать, что пошло не так. В этом коде нет ничего плохого в правильной проверке пользовательского ввода.

Я думаю, что ваша проблема заключается в объявлении вашей метки и вкладки вне цикла. Это создает только одну метку и вкладку. На каждой итерации цикла вы меняете свойства отдельных элементов управления и читаете то же самое в коллекцию. Объявите свои элементы управления внутри цикла, и вы получите новый экземпляр элементов управления.

Private Sub OPCode()
    Dim group_name As String() = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J"} 'my group name
    Dim emer_groupNum As Integer  'my input number
    If Not Integer.TryParse(TextBox1.Text, emer_groupNum) Then
        MessageBox.Show("Please enter a valid number in the box.")
        Exit Sub
    End If
    Dim pos1_Y As Integer = 3
    TabControl1.TabPages.Clear() 'Clear my tabControl
    For i = 1 To emer_groupNum
        Dim mytabPage As TabPage = New TabPage
        Dim myLabel As Label = New Label
        With myLabel
            .Text = "123"
            .Location = New Point(6, pos1_Y)
        End With
        With mytabPage
            .Text = group_name(i - 1) & " Group"
            .Controls.Add(myLabel)
        End With
        TabControl1.TabPages.Add(mytabPage)
    Next
End Sub
person Mary    schedule 15.07.2020

Вы можете создать все TabPages при загрузке формы и сохранить их в списке, а затем просто повторно заполнить TabControl из этого списка:

Private Groups As New List(Of TabPage)

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim group_names As String = "ABCDEFGHIJ"
    For i As Integer = 1 To group_names.Length
        Dim mytabPage As New TabPage
        mytabPage.Text = group_names(i - 1) & " Group"
        Groups.Add(mytabPage)

        Dim myLabel As New Label
        With myLabel
            .Text = "123"
            .Location = New Point(6, pos1_Y) ' <-- Not sure if "pos1_Y" changes?
        End With
        mytabPage.Controls.Add(myLabel)
    Next
End Sub

Private Sub Emer_Num_TextBox_TextChanged(sender As Object, e As EventArgs) Handles Emer_Num_TextBox.TextChanged
    Dim i As Integer
    If Integer.TryParse(Emer_Num_TextBox.Text, i) Then
        If i >= 0 AndAlso i <= Groups.Count Then
            EMER_AUTO_TabControl.TabPages.Clear()
            For Each tab As TabPage In Groups.Take(i)
                EMER_AUTO_TabControl.TabPages.Add(tab)
            Next
        End If
    End If
End Sub
person Idle_Mind    schedule 15.07.2020