Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблемы с DataGridView (C#)

350
01 сентября 2006 года
cheburator
589 / / 01.06.2006
Забросил на форму DataGridView, который отображает данные таблицы sclad из некой БД. Таблица имеет колонки: id (uniqueidentifier) - первичный ключ и name (char(20)). Так вот, запускаю прогу, ввожу новую строку в этот datagrid, но заканчивать ввод строки прога почему-то не хочет - выплевывает сообщение, дескать, в поле id запрещены null-значения. Да, они действительно запрещены. Но при обновлении (Update) данных SQL-сервер сам ведь сгенерирует значение для этой колонки с помощью newid().

Непонятно, зачем прога проверяет значение на null еще в момент ввода строки в datagrid? И как этого избежать?
273
02 сентября 2006 года
3A3-968M
1.2K / / 22.12.2005
Если первичный ключ id не заполняется пользователем, тогда вообще не выводи его в таблицу. Если и выводить, то как не редактируемая колонка. Т.е. сначала, пусть хранимая процедура возвратит созданный id и ты его занесёшь в ячейку. Или ещё проще. Перед редактированием создай запросом новую строку в таблице с заполненным id'ом и сделай Update на DataGridView и новая пустая строка готова для заполнения.
350
02 сентября 2006 года
cheburator
589 / / 01.06.2006
[QUOTE=3A3-968M]Если первичный ключ id не заполняется пользователем, тогда вообще не выводи его в таблицу. Если и выводить, то как не редактируемая колонка. Т.е. сначала, пусть хранимая процедура возвратит созданный id и ты его занесёшь в ячейку. Или ещё проще. Перед редактированием создай запросом новую строку в таблице с заполненным id'ом и сделай Update на DataGridView и новая пустая строка готова для заполнения.[/QUOTE]
Спасибо.
Если честно, я в этом деле начинающий и не всё понял :) Ладно, разберусь.
Но я пробовал делать колонку и невидимой, и нередактируемой, это не помогало. А совсем убрать колонку из DataGridView, наверное, нельзя, иначе как он будет идентифицировать строки в момент Update? Или можно?
И ещё. Ты предлагаешь создавать новую строку с заполненным id-ом и делать Update. Но ведь тогда пользователь на экране увидит эту созданную строку как уже существующую, плюс в самом низу новую строку, что не есть хорошо :(
А может, просто поставить признак nullable в базе данных?
273
04 сентября 2006 года
3A3-968M
1.2K / / 22.12.2005
Можно поставить nullable, но заставлять сервер заполнять это поле. А можно программно создать новый id и засунуть его в соответствующую колонку в GridView. Т.е. при вводе новой строки данных данная ячейка уже будет заполненной. Проблема будет в том, если сервер генерит id'ы случайным образом, а не по порядку.
350
04 сентября 2006 года
cheburator
589 / / 01.06.2006
Спасибо, проблема решилась обработкой событий DefaultValuesNeeded и RowValidating. Правда, чтобы разобраться в этом, ушёл весь день...
350
04 сентября 2006 года
cheburator
589 / / 01.06.2006
Теперь другая проблема.
Есть еще один DataGridView, который берет данные из комбинации двух таблиц, а именно все поля берутся из одной таблицы (Prihod_hdr), среди этих полей есть id склада. Плюс дополнительное поле sclad_name. Запрос для заполнения dataGridView данными выглядит так:
 
Код:
SELECT main.date, main.number, main.sclad, sclad.name AS sclad_name
FROM dbo.prihod_hdr AS main LEFT JOIN dbo.sclad ON main.sclad = sclad.id

Команды InsertCommand, DeleteCommand, UpdateCommand в соответствующем TableAdapter'е я тоже написал руками. Всё вроде должно работать.
Но вот запускаю прогу, добавляю новую строку туда, и тут при вызове dataGridView->Update() выскакивает сообщение "unknown field name, unknown field date, unknown field sclad" и т. д. Не понимаю, почему...
273
08 сентября 2006 года
3A3-968M
1.2K / / 22.12.2005
Попробуй подтвердить ввод строки вызовом функции CommitEdit()
350
08 сентября 2006 года
cheburator
589 / / 01.06.2006
[QUOTE=3A3-968M]Попробуй подтвердить ввод строки вызовом функции CommitEdit()[/QUOTE]
Да нет, ты неправильно понял, я не программно добавляю строку, просто пользователь вводит новую строку или несколько строк, а при закрытии формы срабатывает обработчик Form1_Close, в котором я прописал dataGridView1->Update(), тут-то сообщение и выскакивает.
Причем в программе есть другие формы, на которых также висят DataGridView, на которых аналогичным образом вызывается Update при закрытии формы, но в них всё срабатывает! Просто там в качестве источника данных используется одна таблица, а не две, и соответственно все запросы и команды сгенерированы автоматически. А здесь приходится вручную писать.
Видимо, без выкладывания кода разобраться не получится... Ладно, попробую сам, методом тыка.
31K
27 августа 2007 года
MVictorL
1 / / 15.07.2007
Ищу решение аналогичной проблемы -- DataGridView и две связанные таблицы: реально это или нет?!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог