2010-12-19 13 views
7

Pracuję nad aplikacją, która dodaje obiekty (w zasadzie Windows Forms formanty) w czasie wykonywania z pliku XML. Aplikacja musi uzyskać dostęp do obiektów, które zostały dodane.Znajdź formant w Windows Forms o nazwie

Obiekty są dodawane w panelu lub w grupie. Dla panelu i groupbox mam Panel.Controls ["object_name"], aby uzyskać dostęp do obiektów. Jest to pomocne tylko wtedy, gdy obiekt jest dodawany bezpośrednio na tym samym panelu. W moim przypadku panel główny [pnlMain, mam dostęp tylko do tego panelu] może zawierać inny panel, a ten panel [pnlChild] ponownie zawiera pole grupy [gbPnlChild], a pole grupy zawiera przycisk [przycisk1, chcę uzyskać dostęp do tego przycisku] . Mam następujący sposób:

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

Powyższa metoda jest pomocna, gdy rodzice są znani. W moim scenariuszu znana jest tylko nazwa obiektu, który ma być dostępny [button1], a nie jego rodzice. Jak więc uzyskać dostęp do tego obiektu przez jego nazwę, nieistotną dla jego rodzica?

Czy istnieje metoda taka jak GetObject ("objName") lub coś podobnego?

Odpowiedz

24

Można użyć Controls.Find() metody formularz do pobrania odniesienie powrotem:

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

Pamiętaj, że ta zwraca tablica właściwość Nazwa kontroli mogą być niejednoznaczne, nie ma mechanizmu, który zapewnia, że kontrola ma unikalną nazwę. Musisz to wymusić samemu.

+1

NOT będzie działać w .NET Compact Framework. –

+0

Czy to jest rozróżnianie wielkości liter? –

1

.NET Compact Framework nie obsługuje Control.ControlCollection.Find.

Patrz: Control.ControlCollection Methods i pamiętaj, że nie ma małej ikony telefonu obok metody Znajdź.

W takim przypadku należy zdefiniować w następujący sposób:

// Return all controls by name 
// that are descendents of a specified control. 

List<T> GetControlByName<T>(
    Control controlToSearch, string nameOfControlsToFind, bool searchDescendants) 
    where T : class 
{ 
    List<T> result; 
    result = new List<T>(); 
    foreach (Control c in controlToSearch.Controls) 
    { 
     if (c.Name == nameOfControlsToFind && c.GetType() == typeof(T)) 
     { 
      result.Add(c as T); 
     } 
     if (searchDescendants) 
     { 
      result.AddRange(GetControlByName<T>(c, nameOfControlsToFind, true)); 
     } 
    } 
    return result; 
} 

następnie używać go tak:

// find all TextBox controls 
// that have the name txtMyTextBox 
// and that are descendents of the current form (this) 

List<TextBox> targetTextBoxes = 
    GetControlByName<TextBox>(this, "txtMyTextBox", true); 
3
TextBox txtAmnt = (TextBox)this.Controls.Find("txtAmnt" + (i + 1), false).FirstOrDefault(); 

To działa, gdy wiesz, czego loking.

+0

+1 w wyrażeniu uratował mnie przed błędem! – shipr

2

Jeśli jesteś w kontroli użytkownika i nie mają bezpośredniego dostępu do postaci pojemnika można wykonać następujące czynności

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. 
} 
Powiązane problemy