Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> добавление ряда в DataGridView 
V
    Опции темы
Bogdan1024
  Дата 25.9.2009, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

Репутация: 1
Всего: 13



У меня есть DataGridView. Его датасорс я склеиваю руками. Он представляет собой DataTable. 
В UserAddedRow я SQL'ом добавляю в БД строку, возвращаю её ID и присваиваю его добавленной строке (e.Row["ID"].Value). Но когда я клацаю после добавления куда-нибудь ещё я получаю месседж "в колонку ID нельзя добавлять NULL". 
Я заметил что при добавлении новой строки в моём дататэйбле количество строк не меняется. И ошибка кидается про колонку дататэйбла, а не про колонку датагрида.
Я пытался заново собрать дататэйбл в том же обработчике, но у меня вылетает та же ошибка.
Так как же правильно добавить строку?


--------------------
user posted image
PM MAIL   Вверх
Nestap
Дата 25.9.2009, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 10.10.2008

Репутация: нет
Всего: 0



Bogdan1024

а как ты ета делаеш? ставь код....
--------------------
<?    echo "Nestap";?>
PM WWW ICQ Skype Jabber   Вверх
diadiavova
Дата 28.9.2009, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



Структуры в дотнете не могут иметь значение null, а в базах данных соответствующие им типы могут. Проблема решается при помощи класса Nullable
http://msdn.microsoft.com/ru-ru/library/system.nullable.aspx
Или можно столбцу задать дефолтное значение отличное от null


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Bogdan1024
  Дата 28.9.2009, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

Репутация: 1
Всего: 13



Действительно, нельзя добавлять нул. Можно добавлять DBNull. Тут не в этом проблема. Вот алгоритм того, что происходит:
  • Пользователь что-то написал в новой строке в датагридвью.
  • Происходит событие DataGridView.UserAddedRow.
  • В нём я вставляю в таблицу БД (в БД, а не в DataSource DataGridView'a) новую строку и возвращаю её первичный ключ. Этот первичный ключ я присваиваю вставленной строке.
  • Потом выскакивает ошибка, очевидно из OnRowValidating, что в колонке первичного ключа не может быть нул. Как так? Я только что указал его в UserAddedRow! И реально эта колонка равна NULL.
Тоесть, значение где-то теряется бо я или указываю его не в том обработчике, или какой-то метод не вызываю чтобы значение не пропадало.
Есть идеи у кого?


--------------------
user posted image
PM MAIL   Вверх
Bogdan1024
Дата 30.9.2009, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

Репутация: 1
Всего: 13



Иными словами: как добавить ряд если DataGridView.DataSource is DataTable?


--------------------
user posted image
PM MAIL   Вверх
Nestap
Дата 30.9.2009, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 10.10.2008

Репутация: нет
Всего: 0



Bogdan1024

eto shto li?

           
Код

 DataTable dt = new DataTable();
            MySqlDataAdapter ad = new MySqlDataAdapter("SELECT name FROM persson",Class.Connect.db);
            ad.Fill(dt);
            dataGridView1.DataSource = dt;
            DataRow newrow = dt.NewRow();
            newrow[0] = "blabla  ..  ";
            dt.Rows.Add(newrow);
            dataGridView1.DataSource = dt;

--------------------
<?    echo "Nestap";?>
PM WWW ICQ Skype Jabber   Вверх
Bogdan1024
Дата 1.10.2009, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

Репутация: 1
Всего: 13



Nestap, нед, но спасибо за желание помочь smile
Правильный ответ:
вешаем обработчик на DataTable.ColumnChanged:
Код


        void t_ColumnChanged(object sender, DataColumnChangeEventArgs e)
        {
            if (e.Column.ColumnName == "row_id") return;
            object row_id = e.Row["row_id"];            
            if (row_id is DBNull)
            {//У строки пока что нет первичного ключа.
//Вставляем в БД колонку, присваиваем первичный ключ нашей e.Row: e.Row["row_id"] = первичный ключ :)
            }
            else
            {
//Апдейтим значения в БД используя первичный ключ e.Row (В данном случае это row_id).
            }            
        }

Таким образом решается и задача добавления, и задача редактирования строк.
А на DataTable.UserAddedRow вешать ничего не надо было.

Это сообщение отредактировал(а) Bogdan1024 - 1.10.2009, 16:11


--------------------
user posted image
PM MAIL   Вверх
alegn22
Дата 19.10.2009, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 1.12.2008

Репутация: нет
Всего: нет



На мой взгляд, какая-то странная логика: пользователь еще не закончил ввод новой строки, а Вы уже успели добавить соответствующую строку в БД. А если он впоследствии надумает отменить начатое добавление, то Вам надо будет выполнить обратную операцию удаления строки из БД! А если для строки таблицы определены ограничения NOT NULL для каких-либо колонок, то каким образом, оставаясь в рамках Вашего алгоритма, Вы сможете добавить в БД строку, содержащую только ID? 
Мне кажется, что стоило бы сначала позволить пользователю завершить процесс добавления новой строки, а потом уже сохранять ее в таблице БД. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0757 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.