如何组织VB.net中TableLayoutPanel内的Groupbox中的控件

时间:2013-08-01 13:29:23

标签: vb.net visual-studio-2010 tablelayoutpanel groupbox

我遇到了Windows表单应用程序设计的一个有趣问题,我遇到了一些难以解决的问题。我目前正在开发一个程序,该程序应该是我公司使用的某个清单的数字替代品。这应该是直截了当的,但是已经强制要求程序应该使用SQL数据库的内容来确定程序中的清单上应该有哪些项目(这样可以很容易地更改清单中的项目)。这意味着我必须使用代码而不是Visual Studio 2010设计器动态设计和创建我的应用程序。

我已经能够找出SQL内容甚至是大多数动态设计内容,但有一个复杂的问题我似乎无法打败。为了创建清单的外观,我动态创建一个包含两列和一行的TableLayoutPanel。然后,我从数据库中获取数据并创建一个组合框,其中包含使用该程序的人员需要执行的操作的说明。我还根据数据库条目向组框添加带有标签,复选框或两者的文本框。最后,我将文本框,标签和/或复选框添加到组框中,然后在我的表中添加一行,并将该组添加到该行的表中。但是,组框中的所有控件都被嵌入到行的左上角,因此我尝试使用其.location属性调整其组织。不幸的是,当我改变该属性时,受影响的控件完全从表单中消失。我尝试过使用.bringtofront()方法但没有成功;控件仍然缺失。

我正在寻找的是如何在动态创建的组框(或任何其他分组控件)中组织动态创建的控件的指导,该组框本身包含在另一个动态创建的分组控件中。我真的很感激能得到的任何帮助;这个问题阻止我开始研究程序的功能。适用的代码发布在下面。提前谢谢!

Private Sub addItem(ByVal count As Integer, ByVal itemList As List(Of checklistField))
    If itemList(count).hasTextbox Or itemList(count).hasCheckbox Then
        Dim newGroupbox As New GroupBox
        With newGroupbox
            .Dock = DockStyle.Fill
            .Text = itemList(count).instruction
        End With

        If ((itemList(count).hasTextbox = True) And (itemList(count).hasCheckbox = False)) Then
            Dim newTextboxLabel As New Label
            With newTextboxLabel
                .Text = itemList(count).textboxLabel
                '.Location = New Point(20, (475))
                .AutoSize = True
            End With

            Dim newTextbox As New TextBox
            With newTextbox
                .Name = "Textbox" & count.ToString
                .Size = New Size(100, 20)
                '.Location = New Point(100, (470 + (10 * count)))
            End With

            textboxList.Add(newTextbox)
            newGroupbox.Controls.Add(newTextboxLabel)
            newGroupbox.Controls.Add(newTextbox)

            tblFields.RowCount += 1
            tblFields.RowStyles.Add(New RowStyle(SizeType.AutoSize))
            tblFields.Controls.Add(newGroupbox, 0, tblFields.RowCount - 1)

1 个答案:

答案 0 :(得分:2)

您注释掉的位置属性的Y值设置得太高,因此控件在表单上不可见:

'.Location = New Point(20, (475))
'.Location = New Point(100, (470 + (10 * count)))

控件的位置与父级的客户端空间有关,因此请使用较小的数字:

With newTextboxLabel
  .Text = itemList(count).textboxLabel
  .Location = New Point(20, 20)
  .AutoSize = True
End With

Dim newTextbox As New TextBox
With newTextbox
  .Name = "Textbox" & count.ToString
  .Size = New Size(100, 20)
  .Location = New Point(20, 40)
End With