Encuentre un control en Windows Forms por nombre

Estoy trabajando en una aplicación que agrega objetos (básicamente controles de Windows Forms ) en tiempo de ejecución desde un archivo XML. La aplicación necesita acceder a los objetos que se han agregado.

Los objetos se agregan en un panel o en un cuadro de grupo. Para el panel y groupbox, tengo Panel.Controles [“object_name”] para acceder a los objetos. Esto solo es útil cuando el objeto se agrega directamente en el mismo panel. En mi caso, el panel principal [pnlMain, tengo acceso a este panel solamente] puede contener otro panel y este panel [pnlChild] nuevamente contiene un cuadro de grupo [gbPnlChild] y el cuadro de grupo contiene un botón [button1, quiero acceder a este botón] . Tengo el siguiente método para esto:

Panel childPanel = pnlMain.Controls["pnlChild"]; GroupBox childGP = childPanel.Controls["gbPnlChild"]; Button buttonToAccess = childGP["button1"]; 

El método anterior es útil cuando los padres son conocidos. En mi caso, solo se conoce el nombre del objeto al que se debe acceder [button1] y no sus padres. Entonces, ¿cómo puedo acceder a este objeto por su nombre, independientemente de su padre?

¿Hay un método como GetObject (“objName”) o algo similar?

Puede usar el método Controls.Find () del formulario para recuperar un reverso de referencia:

  var matches = this.Controls.Find("button2", true); 

Tenga en cuenta que esto devuelve una matriz , la propiedad Nombre de un control puede ser ambigua, no existe un mecanismo que garantice que un control tenga un nombre único. Tendrás que hacer cumplir eso por ti mismo.

  TextBox txtAmnt = (TextBox)this.Controls.Find("txtAmnt" + (i + 1), false).FirstOrDefault(); 

Esto funciona cuando sabes lo que estás buscando.

Si tiene un control de usuario y no tiene acceso directo al formulario de contenedor, puede hacer lo siguiente

 var parent = this.FindForm(); // returns the object of the form containing the current usercontrol. var findButton = parent.Controls.Find("button1",true).FirstOfDefault(); if(findButton!=null) { findButton.Enabled =true; // or whichever property you want to change. } 

.NET Compact Framework no es compatible con Control.ControlCollection.Find.

Consulte Control.ControlCollection Methods y tenga en cuenta que no hay un pequeño icono de teléfono junto al método Find.

En ese caso, defina el siguiente método:

 // Return all controls by name // that are descendents of a specified control. List GetControlByName( Control controlToSearch, string nameOfControlsToFind, bool searchDescendants) where T : class { List result; result = new List(); foreach (Control c in controlToSearch.Controls) { if (c.Name == nameOfControlsToFind && c.GetType() == typeof(T)) { result.Add(c as T); } if (searchDescendants) { result.AddRange(GetControlByName(c, nameOfControlsToFind, true)); } } return result; } 

Entonces úsalo así:

 // find all TextBox controls // that have the name txtMyTextBox // and that are descendents of the current form (this) List targetTextBoxes = GetControlByName(this, "txtMyTextBox", true);