2016-12-26 10 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» делает. Итак, как мы можем получить элементы управления без цикла? – Codexer