Как добавить новые вкладки в TabControl и иметь возможность обновлять элементы управления в них?

Мне нужно иметь возможность программно создавать новые вкладки в TabControl, добавлять к ним элементы управления и иметь возможность обновлять элементы управления на каждой вкладке из другой функции. У меня уже есть функция для добавления вкладок к элементу управления и для добавления элементов управления к этим вкладкам при их создании, но я застрял в том, чтобы обновить элементы управления после их создания.

РЕДАКТИРОВАТЬ: Это то, что мне нужно сделать вкладки и добавить элементы управления:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    Dim tabpage As New TabPage
    tabpage.Text = "(empty)"

    Dim textbox1 As New TextBox
    Dim textbox2 As New TextBox

    textbox1.Parent = tabpage
    textbox2.Parent = tabpage

    textbox1.Location = New Point(10, 10)
    textbox2.Location = New Point(10, 30)

    TabControl1.TabPages.Add(tabpage)

End Sub

Уф. Кажется, я не могу вернуться в учетную запись, которую использовал для публикации этого вопроса, поэтому я должен опубликовать свое продолжение на вопрос Тима в комментариях к предыдущему ответу в качестве нового ответа. Debug.WriteLine(TabControl1.TabPages.Item(2).Controls.Find("textbox1", True).Count) возвращает 0. Вкладка и элементы управления были созданы ранее.


person akiwiguy    schedule 12.08.2011    source источник
comment
Публикация кода, который у вас есть в настоящее время, позволит другим программистам дать вам более окончательный ответ. Как правило, я бы подумал, что вы сможете просто ссылаться на рассматриваемые элементы управления через контейнер вкладок, но я не использую WinForms очень часто и не использовал элемент управления Tab с .NET 1.0.   -  person Tim    schedule 12.08.2011
comment
Я обновил сообщение имеющимся у меня кодом. Комментарии мне не нравятся.   -  person akiwiguy    schedule 12.08.2011


Ответы (3)


Хорошо - я попробую, но я действительно ржавый с WinForms, немного менее ржавый с VB.NET. Вам нужно будет найти элемент управления, который вы хотите обновить, и вы сможете сделать это с помощью коллекции Controls соответствующего контейнера - в данном случае, скорее всего, TabPage:

TextBox tb1 = CType(tabpage.Controls.Find("textBox1", false), TextBox)
tb1.Text = "I set the text!"

Синтаксис может быть немного неправильным, но, надеюсь, это, по крайней мере, укажет вам правильное направление.

См. Control.ControlCollection.Find Метод

ОБНОВЛЕНО

Ханс Пассан предположил, что это не работает, потому что вы не установили свойство Name (я предполагаю, что он имеет в виду имя элементов управления, а не страницу вкладки). Я немного больше читал о методе ControlsCollection.Find, и MSDN сообщает: «Ищет элементы управления по их свойству Name и строит массив всех соответствующих элементов управления». Вы (и я) пытались найти элемент управления по имени экземпляра (textbox1, textbox2), которые были именами экземпляров для двух элементов управления, а не именами элемента управления.

Так что попробуйте вместо этого:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    Dim tabpage As New TabPage
    tabpage.Text = "(empty)"

    Dim textbox1 As New TextBox
    Dim textbox2 As New TextBox

    textbox1.Parent = tabpage
    textbox2.Parent = tabpage

    textbox1.Location = New Point(10, 10)
    textbox2.Location = New Point(10, 30)

    textbox1.Name = "textbox1"
    textbox2.Name = "textbox2"

    TabControl1.TabPages.Add(tabpage)

End Sub

Затем вы можете найти элемент управления, используя:

TextBox tb1 = CType(TabControl1.TabPages.Item(TabControl1.TabPages.Count - 1).Controls.Find("textbox1", True)(0), TextBox) 
tb1.text = "Test"

Попробуйте и посмотрите, сработает ли это для вас. Ключ (и то, что я пропустил, глядя на ваш код вчера вечером, так как время для меня уже прошло), заключался в том, что теперь появился способ идентифицировать элемент управления в методе Find.

person Tim    schedule 12.08.2011
comment
Я только что пробовал это: Dim tb1 As TextBox = CType(TabControl1.TabPages.Item(TabControl1.TabPages.Count - 1).Controls.Find("textbox1", True)(0), TextBox) tb1.text = "Test" и получаю исключение IndexOutOfRange. Не знаете, почему, кажется, не удается найти там текстовое поле? - person akiwiguy; 12.08.2011
comment
Пошагово выполняйте свой код в отладчике и перед строкой CType проверьте значения для TabControl1.TabPages.Count и .Controls.Find("textBox1", True), чтобы узнать, сколько элементов находится в ControlsCollection. Также проверьте правописание идентификатора элемента управления - не уверен, чувствителен ли VB.Net к регистру или нет в идентификаторах. - person Tim; 12.08.2011
comment
Debug.WriteLine("TabControl1.TabPages.Count: " & TabControl1.TabPages.Count) и Debug.WriteLine("Control count: " & TabControl1.Controls.Find("textbox1", True).Count) вернули это: TabControl1.TabPages.Count: 3 Контрольный счетчик: 0 Случай правильный, и я до сих пор не уверен, почему он ничего не возвращает. - person akiwiguy; 12.08.2011
comment
Сколько всего элементов управления находится на этом TabPage? Отметьте .Controls.Count. Были ли TabPage и рассматриваемые элементы управления созданы до этой части кода? (Я предполагаю, что они есть, просто проверив очевидное). - person Tim; 12.08.2011
comment
@Hans Passant - Да! Спасибо что подметил это. Вы должны опубликовать его как ответ, чтобы получить за него признание. - person Tim; 13.08.2011

Я знаю, что это старый, но просто мнение, напишите функцию, которая создает И возвращает элемент управления, который вы хотите добавить на вкладку. В этом случае под рукой будет ссылка на элемент управления. Например:

Public Function CreateNewListBoxInsideNewPageTab() As ListBox
        Dim newTab As New TabPage()
        newTab.Text = "Tab " & TabControl1.TabPages.Count + 1

        Dim newLst As New ListBox
        newLst.Dock = DockStyle.Fill

        newTab.Controls.Add(newLst)
        TabControl1.TabPages.Add(newTab)
        TabControl1.SelectedTab = newTab
        Return newLst
    End Function

Теперь, когда я вызываю эту функцию, у меня будет новый список как объект:

Dim newListBox as ListBox = CreateNewListBoxInsideNewPageTab()
newListBox.Items.Add("This is a new listbox item!")
person ThePrivateGeek    schedule 24.04.2012

Могу ли я добавить элементы управления табуляцией после запуска программы?

  For i = 0 To frmMain.cmbZielSpache.Items.Count - 1

        Dim cBox = New CheckBox()
        cBox.Name = "GEN_" & i
        cBox.Location = New Point(offsetX, offsetY)
        cBox.Text = frmMain.cmbZielSpache.Items(i)

        If frmMain.cmbZielSpache.Items(i) = frmMain.cmbZielSpache.Text Or My.Settings.chkTranslate_normal_alleSprachen = True Then
            cBox.Checked = True
        End If

        offsetX = offsetX + 120

        Me.Controls.Add(cBox)
        AddHandler cBox.CheckedChanged, AddressOf checkChangedHandler

    Next i

Вместо использования Me.Controls я хочу добавить флажки после динамического запуска программы.

person Bludau Media    schedule 31.05.2020