2016-12-26 50 views
0

我在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 

回答

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之前測試結果。

+0

建議LINQ的很好的答案。如何找到沒有迴路的控制器是OP所提出的問題。當然你的建議並不直接具有'For'循環,但是你的建議仍然是循環而偏離問題。 LINQ方法只是隱藏它;通過直接調用其GetEnumerator方法或使用其中有Controls.OfType的For Each來枚舉該對象。那麼我們如何才能得到沒有循環的控制? – Codexer

相關問題