Поиск элемента управления в 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);