在vb.net中动态安排控件的问题

时间:2010-06-21 17:03:43

标签: .net vb.net visual-studio

我正在寻找在VS2008中使用VB.net或C#在Windows窗体应用程序中运行时动态排列标签位置(或任何控件)的最佳方法。

我有一个显示用户创建的消息的控件。 此控件有一个停靠在顶部的面板,其中包含每条消息的标头信息,称为pnlHeader

有8个标签: 其中4个显示静态描述(例如“To”,“From”,“Created Date”,“Completed Date”) 其他4显示这些描述的相关数据。 (在运行期间从MS SQL 2005 DB传递)。 静态标签的名称为:lblCreatedDateLbl和动态标签:lblCreatedDate

应用程序在各种大小和分辨率的监视器上运行,因此我希望所有标签在pnlHeader中根据面板的当前宽度以相等的间距排列。

首先,我只是在Designer中创建标签并使用了Anchors(一半标签设置为(顶部,左侧),另一半设置为(顶部,右侧))。此解决方案适用于大多数情况,但并不总是提供一致的解决方案,因此我决定在代码中添加控件。

我认为通过为每个相应的对创建一个面板来处理标签会更容易。因此pnlCreatedDate会保留lblCreatedDateLbllblCreatedDate

我写了两个方法: 1定义每个标签并将其添加到相关面板:Sub AddLabels 和另一个确定面板的宽度并设置正确的位置:Sub SetLoc

目前,AddLabelsInitializeComponent()之后在构造函数中运行,并且在从数据库传入数据后调用SetLoc

我尝试对宽度和大小参数进行微小更改和调整,启用和禁用AutoSize,但没有任何内容返回一致的解决方案,而是所有描述标签都放错地方,或者根本没有出现或完全出现问题上来。如果我完全使用错误的方法,有人可以建议如何最好地处理这项任务吗?

以下是我使用的方法。我非常感谢有关如何最有效和最有效地执行此任务的任何帮助。我是一名新手,但我很乐意学习。所以任何帮助都会很棒,我会提前为这样一个基本问题和长篇描述道歉。

   Private Sub AddLabels()

    'Label Created By:'
    lblCreatedByLbl.Location = New Point(0, 0)
    lblCreatedByLbl.AutoSize = True
    lblCreatedByLbl.Anchor = AnchorStyles.None
    lblCreatedByLbl.ForeColor = Color.FromKnownColor(KnownColor.ControlDark)
    lblCreatedByLbl.Font = New Font(New FontFamily("Microsoft Sans Serif"), 7, FontStyle.Bold, GraphicsUnit.Point)
    lblCreatedByLbl.Text = "By:"

    lblCreatedBy.Location = New Point((lblCreatedByLbl.Location.X + (lblCreatedByLbl.Width)), 0)
    lblCreatedBy.AutoSize = True
    lblCreatedBy.Anchor = AnchorStyles.None
    lblCreatedBy.Text = "Source"
    lblCreatedBy.ForeColor = Color.FromKnownColor(KnownColor.ControlDarkDark)
    lblCreatedBy.Font = New Font(New FontFamily("Microsoft Sans Serif"), 7, FontStyle.Bold, GraphicsUnit.Point)

    pnlCreatedBy.AutoSize = False
    pnlCreatedBy.Controls.Add(lblCreatedByLbl)
    pnlCreatedBy.Controls.Add(lblCreatedBy)
    pnlCreatedBy.Anchor = AnchorStyles.None

    'Label Target'
    lblTargetLbl.Location = New Point(0, 0)
   '... The same idea as above for each label'

End Sub


Private Sub SetLoc()

    pnlCreatedBy.Width = lblCreatedByLbl.Width + lblCreatedBy.Width
    pnlTarget.Width = lblTargetLbl.Width + lblTarget.Width
    pnlCreateDate.Width = lblCreateDateLbl.Width + lblCreateDate.Width
    pnlCompletedDate.Width = lblCompletedDateLbl.Width + lblCompletedDate.Width

    Dim loc As Integer = 0
    Dim x As Integer = (pnlHeader.Width - pnlCreatedBy.Width - pnlTarget.Width - pnlCreateDate.Width - pnlCompletedDate.Width) / 5

    loc += x
    pnlCreatedBy.Location = New Point(loc, 0)
    loc += pnlCreatedBy.Width + x
    pnlTarget.Location = New Point(loc, 0)
    loc += pnlTarget.Width + x
    pnlCreateDate.Location = New Point(loc, 0)
    loc += pnlCreateDate.Width + x
    pnlCompletedDate.Location = New Point(loc, 0)
    loc += pnlCompletedDate.Width + x

    pnlHeader.Controls.Add(pnlCreatedBy)
    pnlHeader.Controls.Add(pnlTarget)
    pnlHeader.Controls.Add(pnlCreateDate)
    pnlHeader.Controls.Add(pnlCompletedDate)

    pnlCreatedBy.BringToFront()
    pnlTarget.BringToFront()
    pnlCreateDate.BringToFront()
    pnlCompletedDate.BringToFront()

End Sub

1 个答案:

答案 0 :(得分:1)

在用户界面中使用TableLayoutPanel。

然后,您可以将TableLayoutPanel停靠到Form的中心(从而填充窗口)。

一旦你有了TableLayoutPanel,就可以将行/列配置为固定大小或总数的百分比。

然后将标签(和其他UI控件)放入TabelLayoutPanel中的单元格中,并将适当的Anchor / Docks设置为控件在Cell中所属的位置。现在,当您调整窗口大小时,您的控件将根据您的TableLayoutPanel定义自动调整大小/移动。