我正在寻找在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
会保留lblCreatedDateLbl
和lblCreatedDate
我写了两个方法:
1定义每个标签并将其添加到相关面板:Sub AddLabels
和另一个确定面板的宽度并设置正确的位置:Sub SetLoc
目前,AddLabels
在InitializeComponent()
之后在构造函数中运行,并且在从数据库传入数据后调用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
答案 0 :(得分:1)
在用户界面中使用TableLayoutPanel。
然后,您可以将TableLayoutPanel停靠到Form的中心(从而填充窗口)。
一旦你有了TableLayoutPanel,就可以将行/列配置为固定大小或总数的百分比。
然后将标签(和其他UI控件)放入TabelLayoutPanel中的单元格中,并将适当的Anchor / Docks设置为控件在Cell中所属的位置。现在,当您调整窗口大小时,您的控件将根据您的TableLayoutPanel定义自动调整大小/移动。