是否可以在不使用循环的情况下找到控件?

时间:2016-12-26 06:47:47

标签: vb.net declare

我在{{ Html::link("route('EditUser',[$user->id])", 'Edit', array('id' => $user->id,'class' =>'btn btn-info'), true)}} 中有许多不同文字的按钮,我想找到带有特定字符串的按钮。

我目前这样做:

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

1 个答案:

答案 0 :(得分:3)

您可以使用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的结果。

相关问题