【问题标题】:VB.NET dynamic use of form controlsVB.NET动态使用表单控件
【发布时间】:2011-01-24 15:44:00
【问题描述】:

我有 10 个标签,名为 lbl1lbl2、...lbl10

我想用 cicle 索引更改它们的适当性(使用 cicle)

for i as integer=1 to 10 step 1
    lbl (i) = PROPRETY 'I know this is wrong but it's what I would do...
end for

我正在使用一种解决方法,但我正在寻找更好的方法..

    Dim exm(10) As Label
    exm(1)=lbl1
    exm(2)=lbl2
    ...
    exm(10)=lbl10

    for i as integer=1 to 10 step 1
        exm (i) = PROPRETY 
    end for

【问题讨论】:

  • 您想浏览表单上的所有标签吗?还是这 10 个标签在某种面板上?

标签: .net vb.net forms controls


【解决方案1】:

您的“解决方法”是一个很好的方法。您需要将控件放在某种集合中,以便遍历它们。

也许你可以使用数组初始化器来更干净地初始化数组(更少的代码):Object and array initializers in VB .NET

您可以浏览 Controls 集合,并为找到的每个标签执行操作,但这可能不是您想要的 - 因为这会让您获得表单上的所有标签。

【讨论】:

    【解决方案2】:

    M.A. Hanin 的回答为基础,您可以简单地执行以下操作:

    (From l in Me.Controls _
    Where RegEx.IsMatch(l.Name, "^lbl[0-9]+") AndAlso TypeOf l is Label
    Order By l.Name).ForEach(Function(l) SetPropertyForLabel(l))
    
    Sub SetPropertyForLabel(lbl as Label)
       ' Do some stuff '
       lbl.Text = lbl.Name
    End Sub
    

    这样,您可以使用正则表达式过滤游览标签的名称(提供的名称与您在 O.P. 上提供的模式匹配)并在自定义方法上执行操作。

    【讨论】:

    • 你能再难一点吗?
    • 谢谢,我会将 lbl 嵌入面板中以仅检查那些 lbl
    • 阅读和维护。硬编码。太多的代码,太多的错误空间,太难有人修复,太难在需要时重构。简直太难了。当某些更改控件的名称或更改类型而不使用 LINQ 时会发生什么?仅举几例。
    • 此外,因为这是 VB.NET,所以使用 RegEx 是多余的和浪费的,因为它需要大对象堆中的 64KB。最好使用 VB 的 LIKE 运算符。
    • 我真的不认为匹配标签名称是一个好方法。
    【解决方案3】:

    如果标签包含在表单或其他容器中,您可以使用与此类似的查询:

    Dim myLabels = (From g As Label In Me.Controls Select g _
                    Where Mid(g.Name, 1, 3) = "lbl" Order By g.Name)
    

    然后遍历集合,应用你的属性。

    【讨论】:

      【解决方案4】:

      您实际上是推荐的技术。您可能想要使用 List(Of Label) 和 For...Each 语句。这将消除硬编码并简化维护。

      【讨论】:

        猜你喜欢
        • 2022-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-12
        • 1970-01-01
        • 1970-01-01
        • 2010-09-27
        相关资源
        最近更新 更多