2013-03-03 73 views
1

我正在使用tabcontrol創建第一頁與設計器。我正在以編程方式在頁面上創建帶有控件的新標籤頁。在每個頁面上有幾個面板,每個面板有兩個單選按鈕(一個是,另一個是否)。第一個面板內嵌有一個面板,其可見屬性設置爲false。如果用戶選擇是,我想嵌套面板的可見屬性設置爲true,這將顯示更多的單選按鈕,他們必須從中做出更多選擇。在tabcontrol的標籤頁上自動設置控件的屬性

我的問題是更改任何頁面上的嵌套面板的屬性,而不是第一頁。我可以檢測到單選按鈕,但我似乎無法找到一種方法來使嵌套面板可見。

Public Class ControlProgram 

Dim pageindx as integer 

Private Sub btnAddPrgm1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAddPrgm1.Click 

    Dim newTab As New TabPage() 
    pageindx = (TabControl1.TabPages.Count + 1) 
    newTab.Text = "Step " & pageindx 
    'define fill panel controls 
    Dim newpnlFill As New Panel 
    Dim newlblFill As New Label 
    Dim newFillY As New RadioButton 
    AddHandler newFillY.CheckedChanged, AddressOf CheckforCheckedChanged 
    Dim newFillN As New RadioButton 
    AddHandler newFillN.CheckedChanged, AddressOf CheckforCheckedChanged 

    'add fill panel controls 
    With newTab.Controls 
     .Add(newpnlFill) 
     With newpnlFill 
      .Location = New System.Drawing.Point(6, 6) 
      .Size = New System.Drawing.Size(171, 137) 
      .BorderStyle = BorderStyle.FixedSingle 
      .Controls.Add(newlblFill) 
      With newlblFill 
       .Name = "Fill" 
       .Text = "Fill ?" 
       .Font = New Font(newlblFill.Font, FontStyle.Bold) 

       .Location = New Drawing.Point(5, 3) 
      End With 
      .Controls.Add(newFillY) 
      With newFillY 
       .Name = "FillY" 
       .Text = "Yes" 
       .Location = New Drawing.Point(23, 28) 
       .Size = New System.Drawing.Size(43, 17) 
      End With 
      .Controls.Add(newFillN) 
      With newFillN 
       .Name = "FillN" 
       .Text = "No" 
       .Location = New Drawing.Point(88, 28) 
       .Size = New System.Drawing.Size(39, 17) 
      End With 
      .Controls.Add(newpnlFill2) 
      With newpnlFill2 
       .Location = New System.Drawing.Point(2, 60) 
       .Size = New System.Drawing.Size(164, 68) 
       .BorderStyle = BorderStyle.FixedSingle 
       .Visible = False 
      End With 
     End With 
    End With 
Private Sub CheckforCheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) 
    If TypeOf sender Is RadioButton Then 

     bEvent = CType(sender, RadioButton).Name 
    End If 
End Sub 

末級

因爲我已經想出了一個解決方案,我delima,使用您的建議作爲出發點。

我添加了幾個varribles: 昏暗RB作爲控制 昏暗bEvent作爲字符串 昏暗booFillY布爾 昏暗booFillN布爾

我還增加了的TabControl TabControl1.TabPages.Add(NEWTAB)

我還做了這些改變:

Private Sub CheckforCheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) 
    If TypeOf sender Is RadioButton Then 

     rb = sender 
     bEvent = CType(sender, RadioButton).Name 
     If bEvent = "FillY" Then 
      Dim newpnlFill2 As Panel = rb.Parent.Controls(3) 
      newpnlFill2.Visible = True 
     End If 
     If bEvent = "FillN" Then 


      Dim newpnlFill2 As Panel = rb.Parent.Controls(3) 
      newpnlFill2.Visible = False 

     End If 
    End If 
End Sub 

現在我可以讓嵌套面板(newpnlFill2)O可見通過在創建的任何標籤頁上選擇是或否單選按鈕來看不到。 感謝您的幫助。我懷疑我會自己得到那裏。

回答

0

我真的不明白你想要的訪問,你先說說

改變嵌套面板的財產其他任何頁面上比第一個

所以我想你想要訪問其他標籤,那麼,你談談:

我似乎無法找到一種方法來製作面板可見

總之,這裏的兩個解決方案:

訪問其他面板:

Private Sub CheckforCheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) 
    If TypeOf sender Is RadioButton Then 
     bEvent = CType(sender, RadioButton).Name '**Where is "bEvent" declared??** 

     Dim newpnlFill2 as Panel = bEvent.Parent.Controls(3), Panel) 
     newpnlFill2.Visible = bEvent.Checked 
    End If 
End Sub 

您訪問Parent這將是newpnlFill,然後訪問Controls(3)它應該是newpnlFill2

訪問其他選項卡:

Private Sub CheckforCheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) 
    If TypeOf sender Is RadioButton Then 
     bEvent = CType(sender, RadioButton).Name '**Where is "bEvent" declared??** 

     Dim TabControl as TabControl = bEvent.Parent.Parent.Parent, TabControl) 
     'Then, you can access all of the other tabs with: 
     'TabControl.TabPages(n) 
    End If 
End Sub 

這個假設某處您添加newTab到一個TabControl。 我看到你永遠不會將newTab添加到任何TabControl,所以你永遠不會看到它.. 第一個ParentnewpnlFill,第二個將引用newTab和最後一個是TabControl的持有Tab。

無論如何,這是非常嚴重的事情,因爲它假設您的標籤總是以這種方式創建的。例如,如果您將在newpnlFill之前添加另一個面板,它將不再是面板中的第4個控件,因此您需要更改訪問代碼。

我的建議是創建您自己的從TabPage繼承的UserControl,通過這種方式您可以創建私有變量,這些私有變量將始終引用您想要更改的面板。此外,btnAddPrgm1_Click事件將更加清晰,在您的類構造函數中移動頁面的構建。 喜歡的東西:

Private Sub btnAddPrgm1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAddPrgm1.Click 
    Dim newTab As New MyTabPage() 
    pageindx = (TabControl1.TabPages.Count + 1) 
    newTab.Text = "Step " & pageindx 
    TabControl1.TabPages.Add(newTab) 
End Sub 
1

不太是你所尋找的,但超heplful,將可能把你帶到任何你需要去。

當我創建應用程序時,我喜歡在加載事件中爲給定頁面構建所有控件的列表,以便我可以隨時訪問它們。這是因爲heplful的WinForms可以約你展示wihin一個標籤頁或組框的子控件非常挑剔,等

'Declare this variable within the class for your form (whatever) 
Public arrControlsRecursive As New List(Of Control) 

'method to recursively check all controls and build to array 
Private Sub BuildControlsArrayRecursive(ByVal InControl As Control) 
    For Each con As Control In InControl.Controls 
     If con.Controls.Count > 0 Then 
      BuildControlsArrayRecursive(con) 
     End If 
     If TypeOf con Is Control Then 
      arrControlsRecursive.Add(con) 
     End If 
    Next 
End Sub 

'Call from MyBase.Load Event 
BuildControlsArrayRecursive(Form1) 

你也可以裝配所有選項卡的列表,例如,通過改變如果語句Is TypeOf con Is TabPage

現在你可以遍歷這個集合或者用LINQ來查詢它。通過調用第一種或單一方法來查找單個控件。轉換爲您想要的類型,並對錶單中任何位置的任何控件執行任何操作。

相關問題