C# winforms datagridview datasource | |
---|---|
AlexSSS Сообщений: 6113 Откуда: Tallinn, Estonia Дата регистрации: 19.09.2005 |
есть форма с редактированием одной таблицы Ship
доступ к данным в проекте организован через DataSet у нее есть две связанные таблицы Flag ShipType как идеалогически правильно организовать dataSource для DataGridView? сейчас у меня используется 4 BindingSource 1. Ship - основная таблица, где редактируются записи 2. Flag (flag.id = ship.flag_id) 3. ShipType (ShipType.id = ship.ShipType_ID) 4. vg_Ship - view c сервера для отображения в гриде полей с разных таблиц. (vg.id = ship.id) Для редактирования таблицы используется источник Ship В датасете таблица Ship связана с vg_Ship (vg.id = ship.id) Перемещаемся по vg_Ship, идет перемещение по Ship, в текстбоксах отражаются корректные данные. Пробовал редактировать vg_Ship, стандартно датасет отказывается сохранять данные (источник - view c join) Вопросы 1. Сейчас после изменения в Ship надо 1a. либо самому прописать vg_Ship.Flag_Name и vg_Ship.ShipType_Name 1b. либо обновить с сервера одну запись в vg_Ship (сейчас я поступаю именно так) Вопрос. как идеалогически правильно делается источник данных для грида, с учетом того, что в нем должны быть данные из нескольких таблиц? 2. Сейчас таблицы Flag и ShipType скачиваются при загрузке формы целиком (поля id, code, name, obsolete). В конкретном примере это неважно, но на других формах будут ссылки на другие таблицы с десятками тысяч записей. Тащить их целиком, хотя в записях в гриде будут ссылки только на сотню, не хочется. И так же не хочется скачивать в таблицы Flag и ShipType по одной записи, когда при перемещении в гриде будет обращение к отсутствующим связанным записям Вопрос - как идеалогически правильнее организовать скачивание записей Flag и ShipType (при редактировании и выборе значения для соответствующих полей все равно придется скачивать почти все записи (за исключением архивных)) [attachment 29862 2018-08-1014_31_18-PortRunning-MicrosoftVisualStudio.png] Исправлено 2 раз(а). Последнее : AlexSSS, 10.08.18 15:05 |
Re: C# winforms datagridview datasource | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Отвечу совсем не в жилу)
Просто есть 25 мин) Я плохо знаю возможности winForm. Как бы решил на asp.net (веб) Я бы все решал на EF. 1. Грид оставил как у тебя есть - от вью. По каждому перемещению, заполнял из БД верхнюю часть, при этом комбо заполнил бы только 1 раз, и в конкретных записях, ставил бы правильные данные. ТОгда тебе надо сохранить только объект Ship (верхний на форме) Наверное так. 2. Ну там где 10.000 записей, вряд ли стоит использовать комбо. Типично, открываешь справочник, выбираешь значение, заполняешь id Кстати, достаточно типовые задачи для веба. Опять тебя в сторону толкаю) ------------------ |
Re: C# winforms datagridview datasource | |
---|---|
AlexSSS Сообщений: 6113 Откуда: Tallinn, Estonia Дата регистрации: 19.09.2005 |
обижаешь ;) это мой класс (несколько текстбоксов (в зависимости от источника) + кнопка), поиск по коду/наименованию или выбор из списка (грида) [attachment 29864 2018-08-1016_27_33-frmShip.png] поиск [attachment 29865 2018-08-1016_40_01-frmShip.png] Исправлено 3 раз(а). Последнее : AlexSSS, 10.08.18 16:41 |
Re: C# winforms datagridview datasource | |
---|---|
Igor Korolyov Автор Сообщений: 34580 Дата регистрации: 28.05.2002 |
Отдельно от source редактирования А Ship тебе зачем, если визуализируешь vg_Ship? А так то нет проблем разные bs даже с разными ds использовать (но тогда вручную управлять CurrencyManager-ом, т.е. "текущей записью"). Мне кажется это слегка избыточно - хватит и таблицы vg_Ship Ну так настроить надо те самые адаптеры - вручную Ins/Upd/Del команды прописать (на таблицу ship), а то и вызов ХП их оборачивающих (если это мсскл и "идеологи" ратующие за "всё через хп" тебя убеждают). Оракл, кстати, умеет для некоторых представлений с join автоматом обновлять базовую таблицу (там понятие key-preserved table фигурирует - если во вью гарантировано можно для каждой записи найти "исходную запись" в основной таблице, то поля взятые из этой таблицы можно обновлять). Для "сложных" случаев в оракле применяют instead of триггера - с их помощью практически любое вью можно редактировать как таблицу. Не знаю можно ли это в твоей СУБД реализовать... И так и этак можно делать. Минусы первого (ну кроме того что надо ручками пару строк кода написать) - изменения в других полях (те что не изменялись) не будут видны (если это НАДО - судя по желанию рефрешить запись перед началом редактирования, то и после оного явно захочешь "свежачок" подтянуть). Минус второго - "лишний" запрос. Так и делается - View данных (не обязательно вью в СУБД - в том же адаптере для таблицы датасета можно запрос прописать) вынимающее все нужные элементы в удобный для отображения вид. А не надо показывать данные из этих таблиц (хватит данных во вью - там то уже "названия" подтянуты). Они нужны лишь для редактирования, и там то вполне можно делать микро-запросы, по введенной части наименования, или шифру, если юзера могут им манипулировать. Не обязательно. Можно только подходящие куски после ввода скажем минимально 3 символов брать, или как в фоксе - таймер и если остановились при вводе более чем на 5 секунд - тянуть по введенному шаблону. Ладно там какие страны/типы по 10-200 записей, но там где 10к крайне нехорошо все эти 10к вынимать... Ну разве что они (справочники) реально супер-статичные, и их можно спокойно закэшировать хоть на месяц в программе (ну и юзеру не жалко сожранной под это дело памяти). ------------------ WBR, Igor |
© 2000-2024 Fox Club  |