A TabControl
只是在同一表单上组织控件的一种奇特方式。重点是他们在同一个表格上!您可能知道您使用Me
访问当前表单,然后使用.ControlName
访问该控件。考虑带有两个选项卡的TabControl
,每个选项卡上有一个TextBox
。这些TextBox
ES是相同的形式,所以你仍然需要使用
Me.TextBox1.Text = "Text 1" ' the same as TextBox1.Text = "Text 1", but I like to be explicit
Me.TextBox2.Text = "Text 2"
你已经知道了,因为你的问题,从这一行为朵朵此。但是,有一些技巧可以帮助你。考虑带有两个选项卡的TabControl
,并在第1页上有一个名为tc1TextBox1
的控件和第2页tc2TextBox1
。我使用前缀来区分页面。第1页上的附加TextBox
将被命名为tc1TextBox2
等,然后说你想CheckBox
ES,你可以有tc1CheckBox1
和tc1CheckBox2
等我将访问他们的方法是使用LINQ
一个模块中定义的扩展方法
Imports System.Runtime.CompilerServices
Public Module ExtensionMethods
<Extension()> _
Public Function ChildControls(Of T As Control)(ByVal parent As Control) As List(Of T)
Dim result As New List(Of Control)
For Each ctrl As Control In parent.Controls
If TypeOf ctrl Is T Then result.Add(ctrl)
result.AddRange(ctrl.ChildControls(Of T)())
Next
Return result.ToArray().Select(Of T)(Function(arg1) CType(arg1, T)).ToList()
End Function
End Module
此方法将返回所有Control
S的内部parent
,并且所有Control
S的内部的,依此类推,递归。它也为您提供IEnumerable
List(Of Control)
,而Control.Controls()
不是IEnumerable
,而只是返回控件中的控件,而不是其容器中的控件。
使用LINQ,您可以通过Type
或Name
筛选ChildControls
的结果。例如,代码
Dim textBoxes = Me.ChildControls(Of TextBox)()
回报所有TextBox
ES在我。让我们把它更进了一步:
Dim textBoxes = Me.ChildControls(Of TextBox)().Where(Function(tb) tb.Name.StartsWith("tc1"))
回报所有TextBox
ES以前缀“TC1”。所以你看到你可以在你的表单上设置控件,以便在运行时更好地对它们进行分组。下面是具体的Excel表
Dim xlBook As Excel.Workbook
For i As Integer = 1 To 20
Dim nameString = "txtSheetName" & i.ToString() ' TextBoxes named txtSheetName1, txtSheetName2, etc.
xlBook.Sheets(i).Name = Me.ChildControls(Of TextBox)().Where(Function(tb) tb.Name = nameString).First().Text
Dim enabledString = "chkEnabled" & i.ToString() ' CheckBoxes named chkEnabled1, chkEnabled2, etc.
xlBook.Sheets(i).Enabled = Me.ChildControls(Of CheckBox)().Where(Function(tb) tb.Name = enabledString).First().Checked
'etc.
Next
一个想法,将循环在你的标签控制指标,并为每个对应的Excel工作表设置属性。这段代码应该给你一个你可以采取的方向的好主意。
来源
2014-01-27 17:51:54
djv
只是通常引用控件...'radioButton1.Checked,numericupDn1.Value,TextBox13.Text'等。我没有看到与标签和组是什么问题。如果他们相对于他们控制的图表命名:'chart7TextBox.Text,chart2NumericUpDn.Value'等 – Plutonix
@Plutonix是正确的。您特别提到,控件是在设计时创建的,因此您应该像平常那样访问它们:使用设计时给出的名称。 – Brandon
我在想每个控件都没有所有的唯一名称会很好。我想循环每个tabpage并分配每个属性。我是新来的编程和新的堆栈溢出,所以我仍然在学习如何提出好问题。感谢您的意见! – Reckhound