Eu preciso obter todos os controles em um formulário que são do tipo x. Tenho certeza de que vi esse código uma vez no passado que usava algo como isto:
dim ctrls() as Control
ctrls = Me.Controls(GetType(TextBox))
Eu sei que posso iterar todos os controles, recebendo crianças usando uma função recursiva, mas há algo mais fácil ou mais direto, talvez o seguinte?
Dim Ctrls = From ctrl In Me.Controls Where ctrl.GetType Is Textbox
Respostas:
Aqui está outra opção para você. Testei-o criando um aplicativo de exemplo e depois coloquei um GroupBox e um GroupBox dentro do GroupBox inicial. Dentro do GroupBox aninhado, coloquei 3 controles TextBox e um botão. Este é o código que eu usei (inclui até a recursão que você estava procurando)
Para testá-lo no evento load do formulário, eu queria uma contagem de todos os controles dentro do GroupBox inicial
E ele retornou a contagem adequada a cada vez, então acho que isso funcionará perfeitamente para o que você está procurando :)
fonte
Em C # (desde que você o marcou como tal), você pode usar uma expressão LINQ como esta:
Edite para recursão:
Neste exemplo, você primeiro cria a lista de controles e depois chama um método para preenchê-lo. Como o método é recursivo, ele não retorna a lista, apenas a atualiza.
Pode ser possível fazer isso em uma instrução LINQ usando a
Descendants
função, embora eu não esteja tão familiarizado com ela. Veja esta página para mais informações.Edite 2 para retornar uma coleção:
Como o @ProfK sugeriu, um método que simplesmente retorna os controles desejados é provavelmente a melhor prática. Para ilustrar isso, modifiquei o código da seguinte maneira:
fonte
Esta é uma versão aprimorada do GetAllControls () recursivo que realmente funciona em vars particulares:
fonte
Combinei várias idéias anteriores em um método de extensão. Os benefícios aqui são que você recebe o enumerável digitado corretamente de volta, e a herança é manipulada corretamente por
OfType()
.fonte
Você pode usar uma consulta LINQ para fazer isso. Isso consultará tudo no formulário que é do tipo TextBox
fonte
var c = this.Controls.OfType<TextBox>()
daria o mesmo resultado?Pode ser a técnica antiga, mas funciona como charme. Usei a recursão para alterar a cor de todos os rótulos do controle. Isso funciona muito bem.
fonte
Gostaria de alterar a resposta do PsychoCoders: como o usuário deseja obter todos os controles de um determinado tipo, podemos usar genéricos da seguinte maneira:
Dessa forma, podemos chamar a função da seguinte maneira:
fonte
.OfType<T>()
método Linq do que.Where(c => c.GetType() == typeof(T)).Cast<T>();
obter o mesmo efeito?Não esqueça que você também pode ter um TextBox dentro de outros controles que não sejam controles de contêiner. Você pode até adicionar um TextBox a um PictureBox.
Então você também precisa verificar se
em qualquer função recursiva.
Este é o resultado que tive de um layout para testar este código:
Tente isso com um botão e um RichTextBox em um formulário.
fonte
Usando reflexão:
fonte
Aqui está o meu método de extensão
Control
, usando o LINQ, como uma adaptação da versão @PsychoCoder :É preciso uma lista do tipo que permite que você não precise de várias chamadas
GetAll
para obter o que deseja. Atualmente, eu o uso como uma versão de sobrecarga.Uso:
fonte
Uma solução limpa e fácil (C #):
Obtenha todas as caixas de texto:
fonte
Você pode usar o código abaixo
fonte
Aqui está o meu método de extensão. É muito eficiente e preguiçoso.
Uso:
O código é:
fonte
Aqui está a solução.
https://stackoverflow.com/a/19224936/1147352
Escrevi este código e selecionei apenas os painéis. Você pode adicionar mais opções ou ifs. iniciar
fonte
fonte
Expressões Lambda
fonte
Eu modifiquei do @PsychoCoder. Todos os controles podem ser encontrados agora (incluem aninhados).
fonte
Isso pode funcionar:
Eu acho que a função para obter todos os controles dos quais você está falando está disponível apenas para o WPF .
fonte
Aqui está uma solução genérica testada e funcionando:
Eu tenho um grande número de controles UpDownNumeric, alguns no formulário principal, outros em caixas de grupo no formulário. Desejo que apenas o último controle selecionado mude a cor de volta para verde, para o qual primeiro defino todos os outros para branco, usando este método: (também pode ser expandido para netos)
fonte
Você pode tentar isso se quiser :)
fonte
Embora vários outros usuários tenham postado soluções adequadas, gostaria de postar uma abordagem mais geral que possa ser mais útil.
Isso se baseia amplamente na resposta de JYelton.
fonte
fonte
fonte
Para quem procura uma versão VB do código C # de Adam, escrita como uma extensão da
Control
classe:NOTA: eu adicionei
BaseType
correspondência para qualquer controle personalizado derivado. Você pode remover isso ou até torná-lo um parâmetro opcional, se desejar.Uso
fonte
Método de Criação
E use-o como
fonte
Como estou usando o VB, escrevi um método de extensão. Que recupera todos os filhos e sub filhos de um controle
Então você pode usá-lo como, onde "btnList" é um controle
Nesse caso, ele selecionará o botão de opção selecionado.
fonte
Simplesmente:
fonte