TabControl в TabPage

У меня возникла следующая проблема: я добавляю динамически созданный TabControl на вкладку (которая также создается динамически). Когда я пытаюсь добавить другую вкладку с другим элементом управления вкладками, он действует так, как будто в новый TabPage не добавлено новое TabControl. По сути, это ничего не добавляет. Что я должен делать? Вот код, в котором я создаю TabPage:

    Dim tbstate As New TabPage
    tbstate.ContextMenuStrip = QuestEd.cmsState
    tbstate.Text = String.Format("State: {0}", txtState.Text)
    QuestEd.TabControl1.TabPages.Add(tbstate)
    txtState.Text = Nothing
    tbstate.Select()
    QuestEd.RefreshData()
    Me.Dispose()

А вот код, в котором я создаю новый TabControl для этого TabPage

Public newtab As New TabControl
     ...
            If QuestEd.TabControl1.SelectedTab.Controls.Count = 0 Then
                newtab.Parent = QuestEd.TabControl1.SelectedTab
                newtab.Dock = DockStyle.Fill
                QuestEd.TabControl1.SelectedTab.Controls.Add(newtab)
                QuestEd.TabControl1.SelectedTab.Refresh()
                newtab.TabPages.Add(String.Format("When: {0}", typ))
            Else
                newtab.TabPages.Add(String.Format("When: {0}", typ))
            End If

Что я делаю не так? Может кто-нибудь подскажет, как это исправить? заранее спасибо


person Jan Bońkowski    schedule 01.02.2014    source источник
comment
Нет. Я забыл добавить пояснение, что такое newtab. newtab - это новый элемент управления Tab. Код поправил, спасибо;)   -  person Jan Bońkowski    schedule 01.02.2014
comment
Крякнула стандартная ловушка VB.NET. QuestEd - это тип, а не объектная ссылка на форму, на которую фактически смотрит пользователь. И код выполняется в рабочем потоке. Таким образом, он создаст новый экземпляр класса формы QuestEd, который вы не видите, потому что его метод Show () никогда не вызывался. Слепое предположение, конечно, обувь подходит.   -  person Hans Passant    schedule 01.02.2014


Ответы (1)


Просто провел быстрый тест вашего кода. Я предполагаю, поскольку у вас есть видимость Public на вашей новой вкладке, вы объявляете ее на уровне класса. Ваш код действительно работает, он добавляет новый TabControl на TabPage. Читая комментарий Ханса, он, скорее всего, прав в том, что происходит. Если вы используете имя класса формы вместо имени экземпляра, вы ничего не увидите. Если вы пытаетесь добавить эти элементы управления из другой формы, вам нужно будет передать экземпляр формы, в которую вы ее добавляете. Если вы не видите, как вы структурируете свой проект, это просто дикая догадка.

Мой пример:

Public Class Form1
    Dim newtab As New TabControl
    Dim typ As String = "Hello"
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim tbstate As New TabPage
        Dim tbstate1 As New TabPage
        tbstate.Text = String.Format("State: {0}", "My Test")
        TabControl1.TabPages.Add(tbstate)
        TabControl1.TabPages.Add(tbstate1)
        tbstate.Select()

    End Sub

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

        If TabControl1.SelectedTab.Controls.Count = 0 Then
            newtab = New TabControl
            newtab.Parent = TabControl1.SelectedTab
            newtab.Dock = DockStyle.Fill
            TabControl1.SelectedTab.Controls.Add(newtab)
            TabControl1.SelectedTab.Refresh()
            newtab.TabPages.Add(String.Format("When: {0}", typ))
        Else
            DirectCast(TabControl1.SelectedTab.Controls(0), TabControl).TabPages.Add(New TabPage(String.Format("When: {0}", typ)))            End If
    End Sub
End Class
person Mark Hall    schedule 01.02.2014
comment
Спасибо, что ответили на мой вопрос. Я попробовал Ваш код, и он работает, но только для одной страницы в TabControl1. Когда я добавляю другую вкладку в TabControl1, она импортирует в нее элемент управления newtab, и ранее созданная страница становится прозрачной. И простите меня, но я не разбираюсь в специальной терминологии, поэтому не понимаю, что Вы пытаетесь сказать. Не могли бы вы использовать другие слова? :) - person Jan Bońkowski; 01.02.2014
comment
Просто изменил код, чтобы разрешить использование нескольких TabControl. Что касается перефразирования того, что я сказал. У вас есть базовый класс, который является вашей формой, вы создаете (экземпляр) формы, когда делаете что-то вроде Dim myForm as new Form1 myForm - это экземпляр, Form1 - это класс. Visual Basic будет использовать экземпляр по умолчанию, если вы используете имя класса, это не то, на что вы смотрите, поэтому вы не видите свои элементы управления. - person Mark Hall; 01.02.2014
comment
Спасибо за помощь :) Сделал просто по назначению. Также спасибо за то, что поделились со мной полезными знаниями. Хорошего дня. - person Jan Bońkowski; 01.02.2014