2014-01-27 36 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

相關問題