Задать вопрос
@AngryGrey
Инженер АСУТП

Как организовать MVP для редактора таблиц?

Добрый день.
Занимаюсь самостоятельным изучением C#, для этого пишу программу для работы. Цель программы брать данные с OPC сервера перебором (по 20 штук) и переносить их на SQL сервер.
Я условно разделил программу на три части:
- простейший редактор таблиц (с валидацией)
- OPC клиент
- SQL клиент

Прототип программы почти дописал. Все основные функции испробовал, но программа получилась очень нестройной и запутанной. Решил воспользоваться MVP для переделки программы. Основной принцип MVP я вроде бы понял:
View - просто отображает данные и реагирует на действия пользователя
Presenter - изменяет как модель, так и представление
Model - контактирует с данными

Посмотрел и повторил несколько простых примеров, но пока не понимаю, как организовать работу простейшего редактора таблиц. Мне не понятно какой должна быть модель и как именно хранить данные для отображения на View.
Например, пользователь решил создать новую таблицу. Выбрал в меню File->New. По щелчку на кнопку New срабатывает событие, на которое подписан Presenter, который в свою очередь запрашивает у Model новую (пустую) таблицу с заранее заданной схемой, и потом у меня ступор. Что должно произойти дальше? Модель должна передать ссылку на новую таблицу в Presenter, который в свою очередь, через интерфейс IView положит её в dataSource компонента DataGridView? Или таблица должна быть создана в модели, а во View отправлена копия? Или как-то еще?

Я пока никак не могу с эти разобраться.

P.S. Я тут порылся и понял, что нужно в сторону виртуального режима datagridview копать.
  • Вопрос задан
  • 244 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Melz
MVP имеет смысл только для WinForms.
WinForms толком смысла сейчас брать нет. Лучше WPF с MVVM.

Есть хороший пример от этого мужика:
markheath.net/downloads/podcastmvp.zip
Presenter как правило или Passive или Observing. У вас видимо пассивный.

Пассивный это жесть тк в все делаете с видом руками через Set/Get. Работает, но кода очень много получается только чтобы галочку поставить.

Поэтому используют "обзервирующий", те виндят (Bindings.Add) вид к презентеру.
Чтобы биндинги работали надо прибиндить таблицу или к ObservingCollection<столбцы таблицы> (WPF/Winforms) или BindingList(winforms).
Presenter должен тогда имплементировать INotifyPropertyChanged как и класс который вы дадите ObservingCollection.
Тут пути M и P расходятся тк в модели у вас какой-нить ORM для базы и вам нужно конвертировать объект который в базе в объект который в таблице. Те вы или передаете объект из презентера в модел, который его чистит и заполняет заново или презентер вызывает метод модели который дает новый объект.

"Ж*па" начнется когда данных станет много и вы решите читать их в таске или исинхронно. В модели сессия ДБ, а они не очень любят когда их используют из другого треда (наша грит мол нет).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы