Trova un controllo in Windows Form per nome

Sto lavorando su un’applicazione che aggiunge oggetti (fondamentalmente controlli Windows Form ) in fase di esecuzione da un file XML. L’applicazione deve accedere agli oggetti che sono stati aggiunti.

Gli oggetti vengono aggiunti in un pannello o in una groupbox. Per il pannello e la groupbox, ho Panel.Controls [“nome_object”] per accedere agli oggetti. Questo è utile solo quando l’object viene aggiunto direttamente sullo stesso pannello. Nel mio caso il pannello principale [pnlMain, ho solo accesso a questo pannello] può contenere un altro pannello e questo pannello [pnlChild] contiene di nuovo un gruppo [gbPnlChild] e il gruppo contiene un pulsante [pulsante1, voglio accedere a questo pulsante] . Ho il seguente metodo per questo:

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

Il metodo sopra è utile quando i genitori sono conosciuti. Nel mio scenario, è noto solo il nome dell’object a cui si deve accedere [button1] e non i suoi genitori. Quindi, come posso accedere a questo object con il suo nome, irrilevante del suo genitore?

Esiste un metodo come GetObject (“objName”) o qualcosa di simile?

È ansible utilizzare il metodo Controls.Find () del modulo per recuperare un riferimento indietro:

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

Attenzione che questo restituisce un array , la proprietà Name di un controllo può essere ambigua, non esiste alcun meccanismo che assicuri che un controllo abbia un nome univoco. Dovrai farlo rispettare da solo.

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

Funziona quando sai cosa stai cercando.

Se si è in un controllo utente e non si ha accesso diretto al modulo contenitore, è ansible eseguire quanto segue

 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 non supporta Control.ControlCollection.Find.

Vedi Control.ControlCollection Methods e nota che non c’è una piccola icona del telefono accanto al metodo Find.

In tal caso, definire il seguente metodo:

 // 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; } 

Quindi usalo in questo modo:

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