Windows Forms, включить отключить элементы управления в зависимости от - PullRequest
4 голосов
/ 20 июля 2011

Кто-нибудь знает правильный подход к включению / отключению элементов управления в форме в зависимости от контекста? Проблема в том, что в моей форме около 50 элементов управления, и их состояние должно зависеть от элементов, выбранных в некоторых списках, флажки установлены, а некоторые данные в БД существуют или нет.

Довольно грубый пример, когда у вас есть многократный выбор дерева и кнопка типа «Сравнить». Эта кнопка должна быть включена только тогда, когда все узлы, выбранные вами в древовидной структуре, имеют одинаковый вид. Более того, дополнительным требованием является то, что это должно быть включено, только если вы выбрали 2 узла. И еще: не каждый класс можно сравнивать, поэтому существует ограничение на то, что именно вы должны выбрать, чтобы сделать сравнение возможным.

Вопрос не в Control.Enabled = true / false. Вопрос о родовом подходе.

Спасибо.

Ответы [ 4 ]

2 голосов
/ 20 июля 2011

Ну, в WPF было что-то, называемое Visual State Manager.Вы можете реализовать нечто подобное в WinForms.По сути, ваша форма может иметь состояние, а изменения элемента управления должны быть разрешены только в состояниях.Затем вы вызываете переход для изменения состояния.По крайней мере, весь код модификации можно затем спрятать в методах, вызываемых менеджером состояний.

http://windowsclient.net/wpf/wpf35/wpf-35sp1-toolkit-visual-state-manager-overview.aspx

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

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

1 голос
/ 20 июля 2011

Другой идеей может быть: сделать каждый элемент управления, которому необходимо управление состоянием, реализовать AsbtractControl класс, который подразумевает для каждого дочернего элемента определение его конкретного состояния уведомления .

Реализация EventManager в вашем приложении, которое «перехватывает» событие, полученное от различных элементов управления, вызывает их как AsbtractControl и нажимает на StateStack состояние, подразумеваемое элементом управления, просто «активированным»пользователем.

Реализация DesitionalEngine , которая выполняет синтаксический анализ при каждом действии StateStack и включает / отключает элементы управления в пользовательском интерфейсе, а также очищает / не обрабатывает стек на основе выполненного задания.Потому что, как вы сказали, определение Enable / Disable может быть выполнено также на основе нескольких действий управления.

Просто для того, чтобы дать вам еще одну идею, вызвать нечто похожее на то, что я реализовал много лет назад для WinForms.

Надеюсь, это поможет.

С уважением.

1 голос
/ 20 июля 2011

Я не уверен, насколько это может быть полезно для вас, но в моем случае, когда такому количеству элементов управления необходимо предпринять действия для ограниченного / ограниченного набора условий, мои подходы таковы:

  1. Отключите все элементы управления по умолчанию и включайте их только при соблюдении условий, необходимых для его использования. Это гарантирует, что пользователь получает визуальную подсказку о том, когда он может использовать элемент управления, но требует больше работы, так как требует, чтобы мы проверяли, когда условия теряются, чтобы снова можно было отключить элемент управления.

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

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

0 голосов
/ 20 июля 2011

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

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