2014-02-11 2 views
0

Мне нужно управлять всеми элементами управления в форме. Я в порядке с доступом к коллекции Controls для этого. Проблема связана с попыткой включить любые элементы управления, содержащиеся в элементах управления контейнером, таких как GroupBox или Panel. Я мог бы рекурсивно перебирать каждую коллекцию Controls каждого Control, но затем получает доступ к всем элементарным элементам управления для контейнеров с нестандартным временем.Определите во время выполнения, если элемент управления позволяет добавить к нему другие элементы управления во время разработки

Поскольку мои элементы управления, не связанные с контейнером, управляют состоянием их составных элементов управления на основе их собственных свойств, я не начинаю возиться с составными элементами управления.

Как определить, является ли элемент управления контейнером времени, так что я могу избежать процесса, который не является?

Я попытался проверки атрибута конструктора, но это возвращает нуль для обоих 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, но оба они оба потому, что, как я полагаю, оба они будут содержать элементы управления во время выполнения.

Как определить контейнер времени разработки?

+0

Какой элемент управления содержит другие элементы управления, которые вы не хотите? Я знаю только один - 'PropertyGrid', и очень легко * исключить его из рекурсии. – Sinatr

+0

Любой составной пользовательский контроль. Я не могу явно проверить все возможности. –

+0

'UserControl' только? Исключить все из них! – Sinatr

ответ

1

В случае Ганс не вернется, а кому-то интересно, это мое решение проблемы на основе предположения Ганса Passant в:

public static bool IsContainerControl(this Control ctl) 
    { 
     if (ctl == null) 
      return false; 

     MethodInfo GetStyle = ctl.GetType().GetMethod("GetStyle", BindingFlags.NonPublic | BindingFlags.Instance); 
     if (GetStyle == null) 
      return false; 

     return (bool)GetStyle.Invoke(ctl, new object[] { ControlStyles.ContainerControl }); 
    } 
+0

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

+0

Да, я еще не могу. У меня есть несколько глупых 48-часовых ограничений. –

+0

Причина, по которой я попросил вас опубликовать ответ, который я бы принял, заключается в том, что, насколько я понимаю, этот сайт оценивает своих пользователей по качеству своих ответов. Вы должны определенно получить кредит за то, что указали мне в правильном направлении. –