Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
vb.net中控件的动态排列问题_.net_Vb.net_Visual Studio - Fatal编程技术网

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

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

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

我有一个显示用户创建的消息的控件。 此控件的顶部有一个面板,用于保存每条消息的标题信息,称为
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——两者都不是完美的。设计器很好,但它可以生成一些难看的代码。我的建议是,使用设计器来接近这些内容,然后转到代码,删除丑陋的硬编码值,并使用一些鼓励更好地调整大小/流动的内容。