以编程方式设置tabcontrol的选项卡页面上的控件的属性

时间:2013-03-03 00:35:27

标签: vb.net

我正在使用tabcontrol,我在设计器上创建了第一页。我正在以编程方式在页面上创建带有控件的新标签页。在每个页面上有几个面板,每个面板有两个radiobuttons(一个是,另一个没有)。在第一个面板中嵌套了一个面板,其visible属性设置为false。如果用户选择yes,我希望嵌套面板的visible属性设置为true,这将显示更多的radiobuttons,他们必须从中做出更多选择。

我的问题是在第一页以外的任何页面上更改嵌套面板的属性。我可以检测到radiobuttons,但我似乎无法找到使嵌套面板可见的方法。

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的解决方案,以你的建议作为起点。

我添加了一些变量:      Dim rb作为Control      Dim bEvent as String      Dim booFillY as Boolean    Dim booFillN as Boolean

我还添加了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)可见或不可见。 谢谢你的帮助。我怀疑我是否会独自到达那里。

2 个答案:

答案 0 :(得分:1)

不是你想要的,但超级健康,可能会让你到达你需要去的地方。

当我创建一个应用程序时,我喜欢在load事件中为给定页面构建一个所有控件的列表,这样我就可以随时访问它们。这很有用,因为WinForms可以非常挑剔地向你展示一个标签页或组合框等的子控件。

'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)

您也可以只汇编所有标签的列表,例如,将If语句更改为Is TypeOf con Is TabPage

现在您可以遍历此集合或使用LINQ查询它。通过调用第一个或单个方法来查找单个控件。转换为您想要的类型,并对表单中任何位置的任何控件执行任何操作。

答案 1 :(得分: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

您可以访问将属于newpnlFill的Parent,然后访问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,所以你永远不会看到它。 第一个Parent将为newpnlFill,第二个将引用newTab,最后一个是包含标签的TabControl。

无论如何,这是非常严重的,因为它假设您的Tab总是以这种方式创建。例如,如果您要在 newpnlFill之前添加另一个面板,它将不再是面板中的第4个控件,因此您需要更改访问代码。

我的建议是创建自己继承TabPage的UserControl,这样就可以创建始终引用要更改的Panel的私有变量。此外,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