Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Узнать в каком классе Control был инициализирован


Автор: Fitc 20.4.2011, 16:42
Здравствуйте! Нужно узнать по объекту Control, в каком классе он был инициализирован и инкапсулирован в поле.  Т.е. объект Control создается как обычно внутри автогенерирующегося файла *Designer.cs. Нужно узнать в каком именно классе, зная только объект Control.

Автор: nikitao 20.4.2011, 16:53
Control.TopLevelControl ?

Автор: Fitc 20.4.2011, 17:01
А если я инициализировал объект Control в классе UserControl, и этот класс UserControl добавил к форме. То для объекта Control свойство TopLevelControl вернет объект UserControl или объект Form (куда добавлен UserControl)?

Автор: nikitao 20.4.2011, 17:17
не. форму вернет конечно. 

Ну можешь тогда в конструкторах форм и UserContol ов в поле Tag записывать родителя , а потом его оттуда считывать. Это наверно самое простое решение для тебя будет.

Автор: Fitc 20.4.2011, 17:21
Нет спасибо этот вариант мне не подходит. Tag у многих Control'ов уже занят.

Автор: Voyager 20.4.2011, 20:56
Control.FindForm,  Control.Parent (можно пройти выше по всем парентам) подойдет?

Автор: nikitao 20.4.2011, 22:17
Цитата(Voyager @  20.4.2011,  21:56 Найти цитируемый пост)
Control.FindForm,  Control.Parent (можно пройти выше по всем парентам) подойдет?

если контро лежит на панели , то вернет эту панель , потом контрол , потом форму. Понять где контрол-создатель в общем случае мне кажется затруднительно , хотя автору виднее конечно.

Тогда надо писать менеджер , где будет хэш-таблица  контрол - его родитель , ну и возможность добавлять\ удалять пары и по контролу узнавать его родителя.
Менеджер реализовать как статический класс или как  класс-одиночку.

Автор: Fitc 21.4.2011, 07:35
Цитата(nikitao @ 20.4.2011,  22:17)

Тогда надо писать менеджер , где будет хэш-таблица  контрол - его родитель , ну и возможность добавлять\ удалять пары и по контролу узнавать его родителя.
Менеджер реализовать как статический класс или как  класс-одиночку.

Я думаю можно обойтись без менеджера - использовать Reflection,т.е. смотреть у родителя, есть ли у него поле с именем данного контрола FieldInfo fieldInfo=ParentControl.GetType().GetField(TargetControl.Name), если есть, то взять значение этого поля var TargetControl2=fieldInfo.GetValue(ParentControl). И если объекты TargetControl и TargetControl2 указывают на одну ссылку, то ParentCotrol является классом-создателем контрола TargetControl

Добавлено через 14 минут и 36 секунд
А как можно узнать, является ли контрол пользовательским (наследуется от стандартного) или же он является стандартным?

Автор: Fitc 21.4.2011, 07:56
Цитата
А как можно узнать, является ли контрол пользовательским (наследуется от стандартного) или же он является стандартным?

Чтоб пропускать родителей, которые стандартные контролы, а заходить только в пользовательские контролы

Автор: Voyager 21.4.2011, 10:51
Цитата(nikitao @ 20.4.2011,  22:17)
если контро лежит на панели , то вернет эту панель , потом контрол , потом форму. Понять где контрол-создатель в общем случае мне кажется затруднительно , хотя автору виднее конечно.

Тогда надо писать менеджер , где будет хэш-таблица  контрол - его родитель , ну и возможность добавлять\ удалять пары и по контролу узнавать его родителя.
Менеджер реализовать как статический класс или как  класс-одиночку.

Да не придумывайте. Используем Control.Parent и, поднимаясь, проверяем на "is Form" и "is UserControl", найдем класс-создатель, который нужен автору.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)