Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 不使用循环就可以找到控件吗?_Vb.net_Declare - Fatal编程技术网

Vb.net 不使用循环就可以找到控件吗?

Vb.net 不使用循环就可以找到控件吗?,vb.net,declare,Vb.net,Declare,我在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 t

我在
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
您可以使用LINQ,例如

Dim btn = myFlowLayoutPanel.Controls.
                            OfType(Of Button)().
                            FirstOrDefault(Function(b) b.Text = myText)
请注意,无论所有子控件是否为按钮,该代码都将起作用,因为类型
确保忽略除按钮之外的任何内容。但是,如果您知道每个子控件都是一个
按钮
,那么执行此操作将更有效:

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)
这样做更有效:

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
仅适用于可能存在零个、一个或多个匹配项的情况。其他方法在其他情况下更合适:

首先
:始终至少有一个匹配项,但可能不止一个匹配项

FirstOrDefault
:可能没有任何匹配项,也可能有多个匹配项

Single
:始终只有一个匹配项

SingleOrDefault
:可能没有匹配项,但不会有多个匹配项

如果使用
或default
方法之一,则结果可能是
Nothing
,并且在使用前应始终测试该结果是否
Nothing

您可以使用LINQ,例如

Dim btn = myFlowLayoutPanel.Controls.
                            OfType(Of Button)().
                            FirstOrDefault(Function(b) b.Text = myText)
请注意,无论所有子控件是否为按钮,该代码都将起作用,因为类型
确保忽略除按钮之外的任何内容。但是,如果您知道每个子控件都是一个
按钮
,那么执行此操作将更有效:

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)
这样做更有效:

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
仅适用于可能存在零个、一个或多个匹配项的情况。其他方法在其他情况下更合适:

首先
:始终至少有一个匹配项,但可能不止一个匹配项

FirstOrDefault
:可能没有任何匹配项,也可能有多个匹配项

Single
:始终只有一个匹配项

SingleOrDefault
:可能没有匹配项,但不会有多个匹配项


如果您使用
或default
方法之一,则结果可能是
Nothing
,并且在使用该方法之前,您应该始终测试该结果是否
Nothing

回答得很好。OP提出的问题是,你如何找到一个没有循环的控件。当然,你的建议没有直接的循环,但是你的建议仍然是循环,偏离了问题。LINQ方法只是隐藏它;通过直接调用对象的
GetEnumerator
方法枚举对象,或者对
控制的每个
使用
。OfType
进行枚举。那么,我们怎样才能在没有循环的情况下得到控制呢?这是一个很好的答案。OP提出的问题是,你如何找到一个没有循环的控件。当然,你的建议没有直接的循环,但是你的建议仍然是循环,偏离了问题。LINQ方法只是隐藏它;通过直接调用对象的
GetEnumerator
方法枚举对象,或者对
控制的每个
使用
。OfType
进行枚举。那么,我们如何在没有循环的情况下获得控件呢?