在运行时移动.NET控件

时间:2010-06-04 16:31:10

标签: vb.net forms controls runtime

我试图将菜单上的所有控件向下或向上移动一个菜单栏的高度,具体取决于它是否可见。我有一些代码,我认为应该对此有用,但似乎Me.Controls在运行时为空,因此永远不会输入for each循环。有人可以提出一个关于如何移动控件的建议吗?

Private Sub uxMenuStrip_VisibleChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles uxMenuStrip.VisibleChanged
    For Each control As Control In Me.Controls
        If control.Name <> "uxMenuStrip" Then
            Dim temp As AnchorStyles = control.Anchor
            control.Anchor = AnchorStyles.None
            control.Top -= ((CInt(uxMenuStrip.Visible) * 2 - 1) * uxMenuStrip.Height)
            control.Anchor = temp
        End If
    Next
    Me.Height += ((CInt(uxMenuStrip.Visible) * 2 - 1) * uxMenuStrip.Height)
End Sub

3 个答案:

答案 0 :(得分:2)

添加一个带控件的新处理程序,并在地址中更改位置

 Public Sub ChngPostion(ByVal sender As System.Object, ByVal e As System.EventArgs)
      For Each cntrl As Control In Me.Controls
         If cntrl.Name = sender.Name Then
             cntrl.Location = New System.Drawing.Point(sender.Location.X,sender.Location.Y)
         End If
      Next
 End Sub

答案 1 :(得分:1)

试试这个:

Private Sub uxMenuStrip_VisibleChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles uxMenuStrip.VisibleChanged
    Dim menu As Control = sender
    Dim dh As Integer = IIf(menu.Visible, 1, -1) * menu.Height
    For Each control As Control In Controls
        If control.Parent Is Me And Not control Is menu Then
            control.Top += dh
        End If
    Next
    Height += dh
End Sub

更新: 无论如何,我强烈建议使用容器,以防使用MenuStrip - ToolStripContainer。

答案 2 :(得分:1)

正如Michael Todd指出的那样,Me.Controls不能为空。此外,这可能不像你想的那样有效。 WinForms应用程序的控件是分层的。 100%干净利落的唯一方法是使移动代码递归。 IE,对每个控件的控件集合中的每个控件执行相同的操作。 (现在我听起来像苏斯博士......)如果你的表格很简单,显然这不是问题。

但是,在一天结束时,您可能最好只将表格中的所有内容放在Panel中,然后只按名称显式移动Panel控件。这将使你想要做的更清楚。