Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.93/14: Рейтинг темы: голосов - 14, средняя оценка - 4.93
troika
6 / 6 / 2
Регистрация: 06.12.2009
Сообщений: 51
1

Обратиться к контролу по имени, если this.Control.Find ничего не находит

22.07.2013, 16:24. Просмотров 2657. Ответов 5
Метки нет (Все метки)

Добрый день. У меня на форме есть один родительский контрол (если конкретно это NavBarControl от Devexpress, но это по идее не так важно). У него есть коллекция групп, каждая из которых является контролом типа NavBarGroup. Если я при помощи визуального дизайнера добавляю в родительский контрол в свойство Groups одну группу с именем NavGroup1, то в коде я к ней могу как через родительский контрол NavBarControl.Groups["NavGroup1"], так и напрямую через this.NavGroup1.
Мне бы хотелось менять в рантайме свойство Visible этих групп, имея только их имя в переменной string. Через this.Controls.Find("NavGroup1", true) найти не получается. Видимо при этом ищутся контролы только в .Controls, а они у меня в .Groups.

Т.е. если коротко, то мне нужно найти контрол по его имени не через this.Controls. Я пробовал через рефлексию, но у меня не получилось. Пробовал примерно так:
C#
1
PropertyInfo FormInfo = this.GetType().GetProperty("NavGroup1", BindingFlags.NonPublic);
Методы GetMember и GetField тоже не нашли котрол.

Добавлено через 1 час 17 минут
Вот получилось взять FieldInfo контрола:
C#
1
2
3
FieldInfo Field = this.GetType().GetField("NavGroup1", BindingFlags.Instance | BindingFlags.NonPublic);
//теперь получаем PropertyInfo  для свойства Visible
PropertyInfo VisibleProperty = Field.FieldType.GetProperty("Visible");
Подскажите как теперь изменить это свойство? VisibleProperty.SetValue требует экземпляр объекта. Его можно как-то получить, или нужно как-то по-другому изменить Visible контрола?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2013, 16:24
Ответы с готовыми решениями:

Обратиться к уникальному контролу
Приветствую. Такая проблема создал коллекцию контролов, и входе работы...

Как обратиться к контролу по индексу
int i = xxx; textBox .Text ="dfsdfds"; как такое сделать?

Как обратиться к контролу, зная его имя?
У меня в строке хранится имя контрола. Подскажите пожалуйста как можно...

Получить доступ к контролу по имени
Можно ли как-то получить доступ к контролу, который находится на панели, не...

Обращение к контролу по имени дает NullReferenceException
string names = { "tb1_", "tb2_", "tb_3", "tb4_", "tb5_" }; for (int i = 1; i...

5
Kruds
694 / 694 / 226
Регистрация: 04.03.2013
Сообщений: 1,384
Завершенные тесты: 1
22.07.2013, 16:34 2
Цитата Сообщение от troika Посмотреть сообщение
в коде я к ней могу как через родительский контрол NavBarControl.Groups["NavGroup1"]
Что же мешает обращаться через коллекцию групп?
К примеру так:
C#
1
NavBarControl.Groups["NavGroup1"].Visible = false;
0
troika
6 / 6 / 2
Регистрация: 06.12.2009
Сообщений: 51
22.07.2013, 17:25  [ТС] 3
Цитата Сообщение от Kruds Посмотреть сообщение
Что же мешает обращаться через коллекцию групп?
К примеру так:
C#
1
NavBarControl.Groups["NavGroup1"].Visible = false;
Видимость элементов предполагается хранить в базе и устанавливать при открытии программы. Не хотелось бы хранить родителя. Тем более что у этого же NavGroup1 есть коллекция Items! Полный путь которым NavBarControl.Groups["NavGroup1"].Items["Item1"]. Вот уже и два родителя надо хранить). А если таки достучаться до него с помощью рефлексии, то ни родителей хранить не надо, ни учитывать особенности контрола (т.е. где именно у него хранятся нужные дочерние контролы, в Groups или Items)
0
Lootero4eg
30 / 30 / 11
Регистрация: 15.07.2013
Сообщений: 72
22.07.2013, 19:20 4
Как сделать без парентовой группы я так и не смог пока найти, но если есть группа то можно вот так попробовать
C#
1
2
3
4
5
FieldInfo Field = this.GetType().GetField("navBarGroup1", BindingFlags.Instance | BindingFlags.NonPublic);
var group = Field.GetValue(this);
var subgroup = group.GetType().GetProperty("ItemLinks").GetValue(navBarGroup1);
foreach (var item in (System.Collections.IEnumerable)subgroup)            
     (item as DevExpress.XtraNavBar.NavBarItemLink).Visible = false;
0
Psilon
Master of Orion
Эксперт .NET
6000 / 4850 / 902
Регистрация: 10.07.2011
Сообщений: 14,460
Записей в блоге: 5
Завершенные тесты: 4
22.07.2013, 20:04 5
troika, Как обратиться к заранее неизвестному текстовому полю?
0
troika
6 / 6 / 2
Регистрация: 06.12.2009
Сообщений: 51
23.07.2013, 09:20  [ТС] 6
Вот так получилось именно то, что я хотел:
C#
1
2
3
4
FieldInfo ControlField = this.GetType().GetField("navBarGroup1", BindingFlags.Instance | BindingFlags.NonPublic);
object ControlValue = ControlField.GetValue(this);
PropertyInfo VisibleProperty = ControlValue.GetType().GetProperty("Visible");
VisibleProperty.SetValue(ControlValue, (object)false, null);
0
23.07.2013, 09:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2013, 09:20

NullReferenceException при обращении к контролу по имени
Здравствуйте. Собственно код: (this.Controls as Label).Text = "+"...

Регулярка ничего не находит
Здравствуйте Есть некая задумка Нужно с сайта вытянуть книги Вот пример...

При динамическом добавлении кнопки в User Control ничего не происходит
Вот код public partial class UserControl1 : UserControl { public...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru