Использование control.Visible возвращает значение False, если оно находится на вкладке, которая не выбрана. - PullRequest
1 голос
/ 28 июля 2010

У меня есть форма с 2 вкладками. Форма открывается на вкладке 1. У меня есть несколько элементов управления, которые нужно проверить на вкладке 2.

Если для элементов управления, которые я хочу проверить, было установлено значение «Не видно», то я хочу игнорировать проверку. (т.е. элементы управления были скрыты от пользователя) Проблема в том, что все элементы управления на вкладке 2 возвращают Visible = False, поскольку вкладка не выбрана.

Becuase Visible на отдельном элементе управления возвращает значение False, если какое-либо из свойств Visible родительского элемента имеет значение False, я не могу выяснить, был ли элемент управления установлен в Visible = False в коде или Visible = False, поскольку родительский элемент управления с вкладками имеет значение не видно.

Любые идеи, как я могу узнать, был ли элемент управления установлен в Visible = False в коде? Закрытая переменная "state" в классе управления, кажется, содержит эту информацию, но я бы предпочел не использовать рефлексию ... это будет медленно и выглядит немного странно!

Моя единственная идея состоит в том, что мне нужно добавить собственное свойство в класс управления, чтобы скрыть их (это написанные мной элементы управления)
Но это означает большую работу над всеми моими формами (у меня есть много форм, в которых есть разные фрагменты кода, чтобы скрыть отдельные элементы управления или группы элементов управления)

Надеюсь, что это имеет смысл.

Спасибо, Майк Г

Ответы [ 3 ]

4 голосов
/ 28 июля 2010

В конце концов я решил использовать отражение.Закончено некоторое тестирование производительности, и кажется, что все в порядке для моего сценария.

Сначала я проверяю наличие элементов формы с вкладками в форме, если их нет, затем могу игнорировать этот код и просто использовать control.IsVisble.Также, если control.Visible reutrns True, тогда ДОЛЖЕН быть установлен, чтобы быть видимым в коде, только тогда в неоднозначном случае я тогда использую это ...

    Private Shared GetStateMethodInfo As MethodInfo = _
GetType(Control).GetMethod("GetState", BindingFlags.Instance Or BindingFlags.NonPublic)

Затем вызовите ...

Return CBool(GetStateMethodInfo.Invoke(control, New Object() {2}))
0 голосов
/ 03 августа 2010

Я решил эту проблему, унаследовав каждый из базовых элементов управления, а затем используя свою собственную реализацию.Затем я мог бы добавить свое собственное свойство isvalidatable к элементу управления.

Звучит намного лучше, чем я знаю, но это позволило нам изменить элементы управления Windows Forms для вариантов DevExpress, изменив только этот базовый класс.

0 голосов
/ 28 июля 2010

Вы можете закодировать значение в свойство Control.Tag, если хотите поместить произвольный маркер в элемент управления.

Однако это не лучший способ управления проверкой ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...