2011-05-17 5 views
0

Я новичок во всем программировании winforms. В начале казалось, что весь код заканчивается. Я - основной класс формы. Поэтому я искал, как вы собираетесь организовывать код в приложениях winforms.C# winforms связь между пользовательскими элементами управления

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

Проблема в том, что я не уверен в наилучшем способе связи между элементами управления и основной формой. Например. Допустим, у меня есть приложение для редактирования чертежа формы. Существует основная форма и пользовательский элемент управления, который рисует объекты. Основная форма хранит объекты. И пользователь может выбирать объекты для редактирования, а выделенный объект должен быть выделен. Таким образом, каждый раз, когда выбор изменяется, основная форма должна указывать на управление отображением, какой объект теперь выбран. Представьте, если у меня было несколько пользовательских элементов управления, которым нужно было знать информацию о состоянии в основной форме. Каждый раз, когда что-то менялось, мне приходилось вызывать функции во всех элементах управления, чтобы они обновлялись. Таким образом, помимо основной формы, которая должна хранить ссылку на выбранный объект, все элементы управления также сохраняют ее. И я должен убедиться, что они все обновлены.

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

Неужели я все это ошибаюсь?

ответ

1

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

Если вы хотите, чтобы основная форма знала об изменении свойств объектов, вы можете реализовать интерфейс INotifyPropertyChanged на своих объектах. См. here.

+0

@Rewinder, если я хочу подписаться на события в основной форме из пользовательского элемента управления, означает ли это, что пользовательскому элементу управления требуется ссылка на основную форму? – terryhau

+0

@terryhau: Да, это так. Лучшее место для этого, вероятно, будет конструктором пользовательского элемента управления. –

+0

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

2

Rewinder верен тем, что вы должны использовать события и INotifyPropertyChanged, чтобы обрабатывать все сообщения в описанном вами сценарии.

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

+0

Если я использую одно событие для всех изменений свойств, и я передаю значение через какой-то EventArgs, как основная форма будет знать, для какого свойства это значение? – terryhau

+0

Просто настройте свой собственный класс для EventArg и поместите в него любую необходимую информацию. Значение, название свойства и т. Д. –

Смежные вопросы

 Смежные вопросы