【问题标题】:Is it possible to find a control without using loop?是否可以在不使用循环的情况下找到控件?
【发布时间】:2016-12-26 06:47:47
【问题描述】:

我在FlowLayoutPanel 中有许多带有不同文本的按钮,我想找到带有特定字符串的按钮。

我目前正在这样做:

Dim str as String = 'some text
For each btn as Button in FlowLayoutPanel.Controls
    If btn.Text = str then
         'do something with btn
    End If
Next

有可能做这样的事情吗?

Dim str as String = 'some text
Dim btn as Button = FlowLayoutPanel.Controls.Button.Text with that string
'do something with btn

【问题讨论】:

    标签: vb.net declare


    【解决方案1】:

    你可以使用 LINQ,例如

    Dim btn = myFlowLayoutPanel.Controls.
                                OfType(Of Button)().
                                FirstOrDefault(Function(b) b.Text = myText)
    

    请注意,无论所有子控件是否为Buttons,该代码都将起作用,因为OfType 确保除了Button 之外的任何内容都会被忽略。如果您知道每个子控件都是Button,那么这样做会更有效率:

    Dim btn = myFlowLayoutPanel.Controls.
                                Cast(Of Button)().
                                FirstOrDefault(Function(b) b.Text = myText)
    

    这样做效率更高:

    Dim btn = DirectCast(myFlowLayoutPanel.Controls.
                                           FirstOrDefault(Function(b) b.Text = myText),
                         Button)
    

    不过,差异可以忽略不计,如果您主要关心的是效率,那么您可能根本不应该使用 LINQ。

    另请注意,FirstOrDefault 仅适用于可能存在零个、一个或多个匹配项的情况。在其他情况下其他方法更合适:

    First: 总会有至少一场比赛,但也可能不止一场。

    FirstOrDefault: 可能没有任何匹配,也可能不止一个。

    Single: 总会有一个匹配。

    SingleOrDefault: 可能没有匹配项,但永远不会超过一个。

    如果您使用OrDefault 方法之一,则结果可能是Nothing,您应该在使用之前始终测试Nothing 的结果。

    【讨论】:

    • 建议 LINQ 的好答案。 you find a control without a loop 如何是 OP 提出的问题。当然,您的建议并不直接包含For 循环,但您的建议仍然是循环并偏离问题。 LINQ 方法只是隐藏它;通过直接调用其GetEnumerator 方法或使用For Each 来枚举该对象,其中Controls.OfType 确实如此。那么我们如何才能在没有循环的情况下获得控件呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 2015-03-04
    相关资源
    最近更新 更多