我需要能够以编程方式在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
Urgh。我似乎无法回到我用来发布这个问题的帐户,因此我必须在对前一个答案的评论中将Tim的问题作为新答案发布。
Debug.WriteLine(TabControl1.TabPages.Item(2).Controls.Find("textbox1", True).Count)
返回0.之前已创建选项卡和控件。
答案 0 :(得分:1)
好的 - 我会给它一个机会,但我真的生锈了WinForms,稍微不那么生锈的VB.NET。您需要找到要更新的控件,并且应该能够通过相应容器的Controls
集合执行此操作 - 在这种情况下,很可能是TabPage
:
TextBox tb1 = CType(tabpage.Controls.Find("textBox1", false), TextBox)
tb1.Text = "I set the text!"
语法可能略有偏差,但希望这至少会指向正确的方向。
请参阅Control.ControlCollection.Find Method
<强>已更新强>
Hans Passant建议这不起作用,因为你没有设置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
方法识别控件的方法。
答案 1 :(得分:1)
我知道这是旧的,但只是一个意见,写一个创建AND的函数返回你想要添加到tabpage的控件。在这种情况下,您将获得随时可用的控件的参考。 例如:
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!")
答案 2 :(得分:0)
程序启动后是否可以添加tabcontroll元素?
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.Control,而是想在程序动态启动后添加复选框。