Мне нужно манипулировать всеми элементами управления в форме. Я в порядке с доступом к коллекции Controls, чтобы сделать это. Проблема возникает при попытке включить любые элементы управления, содержащиеся в элементах управления контейнером, таких как GroupBox
или Panel
. Я мог бы рекурсивно повторять собственную коллекцию Controls каждого элемента управления, но тогда это обращается ко всем составляющим элементам управления для контейнеров, не связанных с проектированием.
Поскольку все мои неконтейнерные элементы управления управляют состоянием составляющих их элементов управления на основе их собственных свойств, я не начинаю возиться с составными элементами управления.
Как определить, является ли элемент управления контейнером времени разработки, чтобы избежать обработки тех, которые им не являются?
Я пытался проверить атрибут Designer, но это возвращает значение null как для ComboBox
, так и для GroupBox
:
foreach(Attribute attr in typeof(ctl).GetCustomAttributes(typeof(Attribute), false))
{
if(typeof(DesignerAttribute).IsAssignableFrom(attr.GetType()))
{
DesignerAttribute da = (DesignerAttribute)attr;
}
}
ctl
относится к типу Control
, а в моем тестировании это либо Combox
, либо GroupBox
.
В обоих случаях GetCustomAttributes
возвращает массив из 1 атрибута, который является значком панели инструментов.
Я также пытался проверить назначаемость из класса ContainerControl
, но они оба являются таковыми, потому что, как я предполагаю, они оба будут содержать элементы управления во время выполнения.
Как обнаружить контейнер времени разработки?
PropertyGrid
и его очень легко исключить из рекурсии. - person Sinatr   schedule 11.02.2014UserControl
? Исключить их всех! - person Sinatr   schedule 11.02.2014Panel
не являетсяUserControl
. - person Sinatr   schedule 11.02.2014