2014-01-27 38 views
-1

如何以编程方式访问选项卡页上的控件?以编程方式访问多个选项卡页上的GroupBox上的控件

我的代码有很多属性,我希望允许用户在程序启动时初始设置。这些属性将用于定义Excel图表,如标题名称,字体颜色,字体大小,图表位置和大小,X系列和其他许多属性。该程序生成许多图表,每个图表都有其自己的一组属性。每个图表具有相同的一组属性但不同的值。

我使用Form 1设计的解决方案:

  1. 我从Form1中的VS 2010工具箱放在TabControl1控制。
  2. 我在TabControl1上创建了19个TabPages
  3. 在每个TabPage上,我为组织创建了多个GroupBoxes。
  4. 最后,我在每个GroupBox中放置了多个控件,如RadioButton,TextBoxes和Spinners。
  5. 以上所有内容都是在设计时完成的。

不好的例子:

Dim TC1 As TabControl = TabControl1.TabPages.Item(1)

这是一个不好的例子,但我想我需要做这样的事情之前,即我可以通过单选按钮达到实际的用户输入,文本框,或Spinners子控件我需要告诉编译器TabControl1的名称和其中包含的每个TabPage。我不知道有关每个包含单选按钮组等

我的问题的GroupBoxes的:你如何编程方式访问位于位于每个标签页的多个GropBoxes控制?我想在每个TabPages中检索所有用户输入属性值,并在创建Excel图表时应用它们。

+3

只是通常引用控件...'radioButton1.Checked,numericupDn1.Value,TextBox13.Text'等。我没有看到与标签和组是什么问题。如果他们相对于他们控制的图表命名:'chart7TextBox.Text,chart2NumericUpDn.Value'等 – Plutonix

+0

@Plutonix是正确的。您特别提到,控件是在设计时创建的,因此您应该像平常那样访问它们:使用设计时给出的名称。 – Brandon

+0

我在想每个控件都没有所有的唯一名称会很好。我想循环每个tabpage并分配每个属性。我是新来的编程和新的堆栈溢出,所以我仍然在学习如何提出好问题。感谢您的意见! – Reckhound

回答

3

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,你可以有tc1CheckBox1tc1CheckBox2等我将访问他们的方法是使用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的内部的,依此类推,递归。它也为您提供IEnumerableList(Of Control),而Control.Controls()不是IEnumerable,而只是返回控件中的控件,而不是其容器中的控件。

使用LINQ,您可以通过TypeName筛选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工作表设置属性。这段代码应该给你一个你可以采取的方向的好主意。

+0

谢谢丹对我的问题的详细答案。我理解你的整体概念和逻辑,我需要一段时间来吸收每一个细节,但它看起来像是一个非常可靠的解决方案。再次感谢! – Reckhound

+0

@Reckhound我希望它能解决。如果确实如此,请标记为已回答。谢谢! – djv

相关问题