vb.net中控件的动态排列问题
我正在寻找在Windows窗体应用程序运行时使用VB.net或VS2008中的C#动态排列标签(或任何控件)位置的最佳方法 我有一个显示用户创建的消息的控件。 此控件的顶部有一个面板,用于保存每条消息的标题信息,称为vb.net中控件的动态排列问题,.net,vb.net,visual-studio,.net,Vb.net,Visual Studio,我正在寻找在Windows窗体应用程序运行时使用VB.net或VS2008中的C#动态排列标签(或任何控件)位置的最佳方法 我有一个显示用户创建的消息的控件。 此控件的顶部有一个面板,用于保存每条消息的标题信息,称为pnlHeader 共有8个标签: 其中4个显示静态描述(例如“到”、“开始”、“创建日期”、“完成日期”) 另外4个显示这些描述的相关数据。(在运行时从MS SQL 2005数据库传入)。 静态标签命名为:lblCreatedDateLbl,动态标签命名为:lblCreatedDa
pnlHeader
共有8个标签:
其中4个显示静态描述(例如“到”、“开始”、“创建日期”、“完成日期”)
另外4个显示这些描述的相关数据。(在运行时从MS SQL 2005数据库传入)。
静态标签命名为:lblCreatedDateLbl
,动态标签命名为:lblCreatedDate
该应用程序在各种大小和分辨率的显示器上运行,因此我希望所有标签根据面板的当前宽度在pnlHeader
中以相等间距排列
起初,我只是在Designer中创建标签并使用锚(一半标签设置为(顶部,左侧),另一半设置为(顶部,右侧))。此解决方案适用于大多数场景,但并不总是提供一致的解决方案,因此我决定在代码中添加控件
我认为通过为每一对相应的标签创建一个面板,使用标签会更容易。因此pnlCreatedDate
将保持lblCreatedDateLbl
和lblCreatedDate
我写了两种方法:
1要定义每个标签并将其添加到相关面板:Sub AddLabels
另一个用于确定面板宽度并设置正确位置:Sub SetLoc
当前,AddLabels
在构造函数中在InitializeComponent()
之后运行,并且从数据库传入数据后调用SetLoc
我尝试过对宽度和大小参数进行细微的更改和调整,启用和禁用自动调整大小,但没有任何结果返回一致的解决方案,而是所有的描述标签都放错了位置,或者根本没有出现,或者出现了完全的重击位置。如果我完全使用了错误的方法,有人能建议如何最好地处理这项任务吗
下面是我使用的方法。我非常感谢任何关于如何最有效地完成这项工作的帮助。我是一个新的程序员,但很想学习。因此,任何帮助都将是巨大的,对于这样一个基本的问题和冗长的描述,我提前表示歉意
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
在UI中使用TableLayoutPanel 然后,您可以将TableLayoutPanel固定到表单的中心(从而填充窗口) TableLayoutPanel就位后,可以将行/列配置为固定大小或占总数的百分比
然后将标签(和其他UI控件)放置到TabelLayoutPanel中的单元格中,并将相应的锚定/停靠设置为控件在单元格中所属的位置。现在,当您调整窗口大小时,您的控件将根据TableLayoutPanel定义自动调整大小/移动。非常感谢,这似乎是任务的逻辑控件。一般来说,你会说试图在代码中操纵UI的视觉方面是个坏主意吗?(而不是尽可能在designer中处理。)@AndalusianCat——两者都不是完美的。设计器很好,但它可以生成一些难看的代码。我的建议是,使用设计器来接近这些内容,然后转到代码,删除丑陋的硬编码值,并使用一些鼓励更好地调整大小/流动的内容。