|
6 / 6 / 1
Регистрация: 09.02.2016
Сообщений: 296
|
|
Архитектура UserControl27.06.2022, 00:56. Показов 675. Ответов 9
Метки нет (Все метки)
Добрый вечер!
Начал осваивать работу с userControl и встал вопрос по архитектуре контрола. Делаю контрол для SerialPort - панель с комбобоксами (portName, baudRate, parity и т.д.). Соответственно нужно работать с двумя типа данных - массивы для Items (получить/передать в форму) и текущее тестовое значение поля (только получить из формы). С полем каждого из значений нужно уметь работать независимо. Самое простое, что приходит на ум - сделать либо методы либо расширить get set и там читать нужное поле комбобокса и записывать. Второй вариант - биндинг. Но мне не удалось сделать полноценный биндинг массива к свойству Items комбобокса. В лучшем случае обновляется только один раз при инициализации, а в дальнейшем при изменении поля список Items остается прежний. Плюс ко всему нужна валидация данных и тут вопрос, где ее правильно делать, в контроле или в основном коде? Если в контроле, то самый простой вариант будет кстати - делаем методы для каждого поля, внутрь суем валидацию и возвращаем true или false в зависимости от результата. Спасибо!
0
|
|
| 27.06.2022, 00:56 | |
|
Ответы с готовыми решениями:
9
Архитектура ПО Архитектура ПС |
| 27.06.2022, 09:16 | |||
|
a13428711, исходя из названия userControl это лишь контрол, его задача отображать что-то. Поэтому вариант со свойствами для передачи в них модели данных для userControl-а является предпочтительным. Однако надо понимать связанность данных. Для Вашего случая userControl используется просто как контейнер объединяющий другие контролы, т.е. связанность данных внутри userControl минимальна или отсутствует вообще. Сделайте общими контролы внутри userControl-а и работайте с ними на прямую.
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
|
|
| 27.06.2022, 19:13 | |
|
a13428711, либо реализуйте интерфейс
INotifyPropertyChanged, либо заново присваивайте свойство .DataSource элемента управления, который отображает коллекцию. Можно также привязывать коллекцию через BindingSource, для обновления нужно будет вызвать метод .ResetBindings(Bool)
0
|
|
| 27.06.2022, 19:43 | ||
|
Добавлено через 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 | ||
|
Я так понимаю, что вы получаете список портов с помощью 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
|
|
| 02.07.2022, 15:28 | |
|
a13428711, Вы что-то путаете, INotifyPropertyChanged интерфейс, реализовав который гарантируется возникновение события при изменении свойств в классе. Вам надо чтобы источник скоростей сообщал, что список скоростей изменён, а не реализовывать это в контроле.
0
|
|
| 02.07.2022, 15:28 | |
|
Помогаю со студенческими работами здесь
10
Refresh UserControl UserControl в DataGridView Backgroundworker и UserControl Не появляется UserControl
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
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-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|