Найти элемент управления в Windows Forms по имени - PullRequest
8 голосов
/ 19 декабря 2010

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

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

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

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

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

Ответы [ 4 ]

26 голосов
/ 19 декабря 2010

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

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

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

3 голосов
/ 28 ноября 2013
  TextBox txtAmnt = (TextBox)this.Controls.Find("txtAmnt" + (i + 1), false).FirstOrDefault();

Это работает, когда вы знаете, что вы ищете.

2 голосов
/ 06 марта 2015

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

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.
}
1 голос
/ 28 сентября 2013

.NET Compact Framework не поддерживает Control.ControlCollection.Find.

См. Методы Control.ControlCollection и обратите внимание, что рядом с методом Find нет маленького значка телефона.

В этом случае определите следующий метод:

// 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...