【发布时间】:2018-01-02 21:44:01
【问题描述】:
我有一个表单,允许用户通过按“添加”按钮在面板中生成多个面板,其中包含一些不同的内容。根据用户在面板中的操作,面板会扩大和缩小以适应内容。由于这种变化是大小,我创建了一个子格式,用于格式化表单上的面板。
Private Sub formatPanels(frm As Form)
Dim count As Integer = 0
Dim startPoint As Point = New Point(12, 80)
Dim endPoint As Point = New Point(0, 0)
Dim maxY As Integer = 0
For Each pnl As Control In frm.Controls
If TypeOf pnl Is Panel Then
ReDim Preserve _arr_Panels(count)
_arr_Panels(count) = pnl
count += 1
pnl.Location = startPoint
startPoint.Y += pnl.Size.Height + 30
End If
Next
End Sub
如您所见,我们循环遍历每个面板,第一个总是从位置 (12,80) 开始,然后随着面板的大小和一些间距而递增。
这就是问题所在。这仅在我向下滚动表单时发生。面板间距突然变大,并决定将第一个面板放在表格下方数百像素处。位置属性是否基于您正在查看的内容?所以如果我向下滚动表单位置(0,0)将是当前视图的左上角?位置一定有一些我不知道的奇怪属性。
谢谢
【问题讨论】:
-
循环遍历控件的
Controls集合遵循 z 顺序,因此如果您的Panel控件的 z 顺序不是您所期望的,我不会感到惊讶。与其一直使用非常低效的代码来构建数组,不如一开始就创建一个List(Of Panel),然后在创建它们时将Panels添加到其中?这样,您每次都可以简单地循环,然后除其他优点外,z-order 变得无关紧要。 -
另外,为什么你有一个方法来传递表单?您说“我有一个表格”,这似乎表明这只适用于一种表格。在这种情况下,操作
Panels的方法应该在该表单内,并且应该使用Me引用自身。即使您有多个表单,您仍然可以将该功能放入基类中。 -
说了这么多,你的代码可能是完全没有必要的。无论如何,您很可能应该使用
TableLayoutPanel或FlowLayoutPanel,在这种情况下,布局会自动处理。 -
您的面板上是否设置了 Anchor 属性?
-
好的,我切换到使用面板列表,效果更好。但是,我的问题没有解决。仍然好像“起点”(12,18)取决于我正在查看的内容,而不是表单的最左上角。当我向下滚动表单时,我仍然会遇到主要的间距问题。只有当我向下滚动表单时才会发生这种情况。我知道这是真的,因为我尝试过调整表单本身的大小。尚未设置锚属性我尝试了它们,但它们没有做任何事情。这不是面板内控件的问题,而是面板本身的问题。