Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
6 / 6 / 1
Регистрация: 09.02.2016
Сообщений: 296

Архитектура UserControl

27.06.2022, 00:56. Показов 675. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!
Начал осваивать работу с userControl и встал вопрос по архитектуре контрола.
Делаю контрол для SerialPort - панель с комбобоксами (portName, baudRate, parity и т.д.). Соответственно нужно работать с двумя типа данных - массивы для Items (получить/передать в форму) и текущее тестовое значение поля (только получить из формы). С полем каждого из значений нужно уметь работать независимо.

Самое простое, что приходит на ум - сделать либо методы либо расширить get set и там читать нужное поле комбобокса и записывать.
Второй вариант - биндинг. Но мне не удалось сделать полноценный биндинг массива к свойству Items комбобокса. В лучшем случае обновляется только один раз при инициализации, а в дальнейшем при изменении поля список Items остается прежний.

Плюс ко всему нужна валидация данных и тут вопрос, где ее правильно делать, в контроле или в основном коде? Если в контроле, то самый простой вариант будет кстати - делаем методы для каждого поля, внутрь суем валидацию и возвращаем true или false в зависимости от результата.

Спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.06.2022, 00:56
Ответы с готовыми решениями:

Перенос данных из UserControl в UserControl
Всем привет ! :) Суть проблемы следующая: • Есть 2 UserControl “V” и “MN” • В “V” есть textBox “Vso2” с названием...

Архитектура ПО
Привет, всем! Пишу курсач, и не могу построить архитектуру приложения. Суть приложения : Сделать аналог hotline.ua только для...

Архитектура ПС
Здравствуйте, помогите пожалуйста описать высокоуровневую архитектуру всей ПС. В описании необходимо четко указать назначение каждого...

9
2283 / 1599 / 400
Регистрация: 26.06.2017
Сообщений: 4,740
Записей в блоге: 1
27.06.2022, 09:16
a13428711, исходя из названия userControl это лишь контрол, его задача отображать что-то. Поэтому вариант со свойствами для передачи в них модели данных для userControl-а является предпочтительным. Однако надо понимать связанность данных. Для Вашего случая userControl используется просто как контейнер объединяющий другие контролы, т.е. связанность данных внутри userControl минимальна или отсутствует вообще. Сделайте общими контролы внутри userControl-а и работайте с ними на прямую.
Цитата Сообщение от a13428711 Посмотреть сообщение
мне не удалось сделать полноценный биндинг массива к свойству Items комбобокса
А туда и не биндится, биндится к DataSource или я что-то не так понял?
Цитата Сообщение от a13428711 Посмотреть сообщение
где правильно делать валидацию
В контролах. Тех, что внутри userControl или в самом userControl.
1
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,136
Записей в блоге: 1
27.06.2022, 09:31
про валидацию
Архитектура ПО в WinForms (FAQ & HowTo)
1
6 / 6 / 1
Регистрация: 09.02.2016
Сообщений: 296
27.06.2022, 18:40  [ТС]
Спасибо за ссылку - нашел ответ на этот вопрос. Да и в принципе материал полезный, ознакомлюсь на досуге.

Добавлено через 3 минуты
Uswer, По первой части - понял, данные в отдельный контейнер.

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

По третьей - принял, спасибо!

Добавлено через 3 минуты
Проблема с единожды обновляющимися из массива Items-ами состоит в том, что после инициализации порта может быть понадобиться сменить порт, а к этому моменту список доступных портов может измениться, поэтому когда мы раскрываем комбобокс, там должен содержаться обновленный список.
0
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,136
Записей в блоге: 1
27.06.2022, 19:13
a13428711, либо реализуйте интерфейс INotifyPropertyChanged, либо заново присваивайте свойство .DataSource элемента управления, который отображает коллекцию. Можно также привязывать коллекцию через BindingSource, для обновления нужно будет вызвать метод .ResetBindings(Bool)
0
2283 / 1599 / 400
Регистрация: 26.06.2017
Сообщений: 4,740
Записей в блоге: 1
27.06.2022, 19:43
Цитата Сообщение от a13428711 Посмотреть сообщение
биндил массив, который находится в экземпляре объекта
Просто указать массив в качестве источника мало, надо чтобы источник поддерживал интерфейсы обновления (IBindingList, IBindingListView). Самый простой способ обеспечить нормальную привязку данных это добавить посредника BindingSource.

Добавлено через 12 минут
NewOrdered, интерфейс INotifyPropertyChanged поможет только в случае реализации в модели данных, а ТС пишет "биндил массив", где этот массив не понятно, но можно предположить, что он просто возвращается из функции поиска списка портов.
0
6 / 6 / 1
Регистрация: 09.02.2016
Сообщений: 296
27.06.2022, 20:15  [ТС]
Массивы для Items-ов были внутри класса.
Вызывать отдельно .ResetBindings(Bool) мне кажется плохой затеей - это нам надо обновить поле, а потом сделать еще одно действие, невыполнение которого в эксепшн нас не выкинет, но может доставить проблем в дальнейшем (человеческий фактор как никак). Я правильно понимаю суть?

Сейчас вижу два варианта: либо сделать как посоветовали INotifyPropertyChanged, либо каждому полю присвоить метод, который будет принимать массив данных и внутри сам либо напрямую прописывать в Items, либо вызывать .ResetBindings(Bool) (если мы до этого сделаем биндинг).
Я так понимаю, первый вариант предпочтительнее?
0
2393 / 1922 / 763
Регистрация: 27.07.2012
Сообщений: 5,565
27.06.2022, 21:05
Цитата Сообщение от a13428711 Посмотреть сообщение
Сейчас вижу два варианта: либо сделать как посоветовали INotifyPropertyChanged, либо каждому полю присвоить метод, который будет принимать массив данных и внутри сам либо напрямую прописывать в Items, либо вызывать .ResetBindings(Bool) (если мы до этого сделаем биндинг).
Это какой-то бессвязный набор слов.

Я так понимаю, что вы получаете список портов с помощью SerialPort.GetPortNames(), и вам надо, чтобы он в любой момент был актуален. Но у SerialPort не события, которое происходило бы при обновлении списка портов, поэтому придётся вручную вызывать эту функцию тогда, когда это понадобится. Надо только решить, когда. Как вы этот список привяжете к комбо-боксу - дело десятое. Возможно для вашей задачи хватит и comboBox.Items.AddRange(SerialPort.GetPortNames()).
0
6 / 6 / 1
Регистрация: 09.02.2016
Сообщений: 296
01.07.2022, 23:56  [ТС]
John Prick, Кстати да, не предусмотрел я этот момент. Значит нужно либо пробросить делегат, либо создать событие по клику на комбобоксе, на которое нужно будет подписаться в основной форме.
Какой вариант предпочтительнее?

И еще. У формы таки будет еще одно поле - BaudRate, которое задает скорость работы порта и тут уже список доступных скоростей надо пробрасывать через из основного кода. Как лучше сделать - сделать отдельный метод, который принимает массив скоростей, либо реализовать через INotifyPropertyChanged?
0
2283 / 1599 / 400
Регистрация: 26.06.2017
Сообщений: 4,740
Записей в блоге: 1
02.07.2022, 15:28
a13428711, Вы что-то путаете, INotifyPropertyChanged интерфейс, реализовав который гарантируется возникновение события при изменении свойств в классе. Вам надо чтобы источник скоростей сообщал, что список скоростей изменён, а не реализовывать это в контроле.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.07.2022, 15:28
Помогаю со студенческими работами здесь

Refresh UserControl
Собственно как перезагрузить компоненты в UserControl'е ? искал в инете инфу по поводу Refresh(); но почему-то не хочет работать

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

Backgroundworker и UserControl
Здравствуйте, появилась проблема с backgroundworker'ом, который работает в пределах usercontrol'а. Необходимо запустить backgroundrowker...

Не появляется UserControl
Не появляется UserControl при выборе элемента ComboBox public Form1() { InitializeComponent(); ...

Ресурс в UserControl
Здравствуйте. Есть ли возможность запихнуть картинку (иконку) непосредственно в контрол, без использования ресурсов из проекта или...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru