如何使用每个循环用户控件在我自己的容器中

时间:2016-12-19 08:27:27

标签: vb.net loops foreach

我有一个继承自Panel的类myPanel,我在myPanel中有一些标签,我需要在运行时更改标签localtion。

       For Each pn As myPanel In ref.flp_balance.Controls
            If ref.flp_balance.VerticalScroll.Visible Then
                pn.label.Left = ref.flp_balance.Right - 160
            Else
                pn.label.Left  = ref.flp_balance.Right - 135
            End If
       Next

我在运行时遇到此错误,直到每个

“InvalidCastException is unhandle”

“附加信息:无法将”System.Windows.Forms.Panel“类型的对象强制转换为”XXX.myPanel“。”

1 个答案:

答案 0 :(得分:1)

容器 flp_balance 似乎还包含普通的Panel,不仅是 myPanel 类型的元素。如果这不是设计错误,那么你可以改变你的foreach循环,引入扩展名OfType仅返回所需类型的元素。

For Each pn As myPanel In ref.flp_balance.Controls.OfType(Of myPanel)()

此外,如果您想调整面板的尺寸以考虑是否存在垂直或水平滚动条,则应避免在用户根据喜好调整其系统的显示首选项时失败的“幻数” 。
WinForms命名空间中有两个属性为您提供实际系统所需的值

HorizontalScrollBarHeigth
VerticalScrollBarWidth