Necesito obtener todos los controles en un formulario que sea de tipo x. Estoy bastante seguro de que vi ese código una vez en el pasado que usaba algo como esto:
dim ctrls() as Control
ctrls = Me.Controls(GetType(TextBox))
Sé que puedo iterar sobre todos los controles haciendo que los niños usen una función recursiva, pero ¿hay algo más fácil o más sencillo, tal vez como lo siguiente?
Dim Ctrls = From ctrl In Me.Controls Where ctrl.GetType Is Textbox
Respuestas:
Aquí tienes otra opción. Lo probé creando una aplicación de muestra, luego puse un GroupBox y un GroupBox dentro del GroupBox inicial. Dentro del GroupBox anidado puse 3 controles TextBox y un botón. Este es el código que usé (incluso incluye la recursividad que estabas buscando)
Para probarlo en el evento de carga de formulario, quería un recuento de todos los controles dentro del GroupBox inicial
Y devolvió el recuento adecuado cada vez, así que creo que esto funcionará perfectamente para lo que está buscando :)
fuente
En C # (ya que lo etiquetó como tal) podría usar una expresión LINQ como esta:
Editar para recursividad:
En este ejemplo, primero crea la lista de controles y luego llama a un método para completarla. Dado que el método es recursivo, no devuelve la lista, solo la actualiza.
Puede ser posible hacer esto en una declaración LINQ usando la
Descendants
función, aunque no estoy tan familiarizado con ella. Consulte esta página para obtener más información al respecto.Edite 2 para devolver una colección:
Como sugirió @ProfK, un método que simplemente devuelve los controles deseados probablemente sea una mejor práctica. Para ilustrar esto, modifiqué el código de la siguiente manera:
fuente
Esta es una versión mejorada del recursivo GetAllControls () que realmente funciona en variables privadas:
fuente
Combiné un montón de ideas anteriores en un método de extensión. Los beneficios aquí son que obtiene el enumerable correctamente escrito, además de que la herencia se maneja correctamente
OfType()
.fuente
Puede utilizar una consulta LINQ para hacer esto. Esto consultará todo en el formulario que sea de tipo TextBox
fuente
var c = this.Controls.OfType<TextBox>()
daría el mismo resultado?Puede que sea la técnica antigua, pero funciona de maravilla. Usé la recursividad para cambiar el color de todas las etiquetas del control. Funciona muy bien.
fuente
Me gustaría modificar la respuesta de PsychoCoders: como el usuario desea obtener todos los controles de un cierto tipo, podríamos usar genéricos de la siguiente manera:
De esta forma, podemos llamar a la función de la siguiente manera:
fuente
.OfType<T>()
método Linq que.Where(c => c.GetType() == typeof(T)).Cast<T>();
obtener el mismo efecto?No olvide que también puede tener un TextBox dentro de otros controles además de los controles de contenedor. Incluso puede agregar un TextBox a un PictureBox.
Por lo tanto, también debe verificar si
en cualquier función recursiva.
Este es el resultado que obtuve de un diseño para probar este código:
Pruebe esto con un botón y un RichTextBox en un formulario.
fuente
Usando la reflexión:
fuente
Aquí está mi método de extensión para
Control
, usando LINQ, como una adaptación de la versión de @PsychoCoder :En su lugar, se necesita una lista de tipos que le permite no necesitar múltiples llamadas
GetAll
para obtener lo que desea. Actualmente lo uso como una versión de sobrecarga.Uso:
fuente
Una solución limpia y fácil (C #):
Obtén todos los cuadros de texto:
fuente
Puede utilizar el siguiente código
fuente
Aquí está mi método de extensión. Es muy eficiente y perezoso.
Uso:
El codigo es:
fuente
Aquí está la solución.
https://stackoverflow.com/a/19224936/1147352
Escribí este código y seleccioné solo los paneles, puede agregar más interruptores o ifs. en eso
fuente
fuente
Expresiones lambda
fuente
Modifiqué de @PsychoCoder. Todos los controles se pueden encontrar ahora (incluidos los anidados).
fuente
Esto puede funcionar:
Creo que la función para obtener todos los controles de los que estás hablando solo está disponible para WPF .
fuente
Aquí hay una solución genérica probada y funcional:
Tengo una gran cantidad de controles UpDownNumeric, algunos en el formulario principal, algunos en cuadros de grupo dentro del formulario. Quiero que solo el último control seleccionado cambie el color de fondo a verde, para lo cual primero configuro todos los demás en blanco, usando este método: (también se puede expandir a nietos)
fuente
Puedes probar esto si quieres :)
fuente
Aunque varios otros usuarios han publicado soluciones adecuadas, me gustaría publicar un enfoque más general que puede ser más útil.
Esto se basa en gran medida en la respuesta de JYelton.
fuente
fuente
fuente
Para cualquiera que busque una versión VB del código C # de Adam escrito como una extensión de la
Control
clase:NOTA: He agregado
BaseType
coincidencias para cualquier control personalizado derivado. Puede eliminar esto o incluso convertirlo en un parámetro opcional si lo desea.Uso
fuente
Método de creación
Y usarlo como
fuente
Estoy saldy usando VB, así que escribí un método de extensión. Que recuperan todos los hijos y sub hijos de un control
Entonces puedes usarlo como, donde "btnList" es un control
En este caso, seleccionará el botón de radio seleccionado.
fuente
Simplemente:
fuente