Поиск элемента управления в Windows Forms по имени

Я работаю над приложением, которое добавляет объекты (в основном Windows Forms controls) во время выполнения из XML-файла. Приложение должно получить доступ к добавленным объектам.

объекты добавляются в панель или в groupbox. Группа и группа, у меня группа.Контроль["имя_объекта"] для доступа к объектам. Это полезно только тогда, когда объект непосредственно добавлен на той же панели. В моем случае основная панель [pnlMain, у меня есть доступ к этому только панель] может содержать другую панель, и эта панель [pnlChild] снова содержит groupbox[gbPnlChild], а groupbox содержит кнопку [button1, я хочу получить доступ к этой кнопке]. У меня есть следующий метод для этого:

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

вышеуказанный метод полезен, когда родители известны. В моем сценарии известно только имя объекта, к которому должен быть обращен [button1], а не его родители. Итак, как мне получить доступ к этому объекту по его имени, не относящемуся к его родителю?

там такой метод, как GetObject("objName") или что-то подобное?

4 ответов


вы можете использовать форму управление.Find () метод для получения ссылки назад:

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

остерегайтесь, что это возвращается массив свойство name элемента управления может быть неоднозначным, нет механизма, который гарантирует, что элемент управления имеет уникальное имя. Вам придется самому это сделать.


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

это работает, когда вы знаете, что вы loking для.


Если вы находитесь в пользовательском элементе управления и не имеете прямого доступа к форме контейнера, вы можете сделать следующее

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 не поддерживает управление.Экземпляре коллекции controlcollection.Находить.

посмотреть управление.Методы Экземпляре Коллекции Controlcollection и обратите внимание, что рядом с методом поиска нет маленького значка телефона.

в этом случае определить следующим образом:

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

тогда используйте его так:

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