Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > добавление ряда в DataGridView


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

Автор: Nestap 25.9.2009, 19:53
Bogdan1024, 

а как ты ета делаеш? ставь код....

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

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

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

Автор: Nestap 30.9.2009, 20:48
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;

Автор: Bogdan1024 1.10.2009, 16:10
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 вешать ничего не надо было.

Автор: alegn22 19.10.2009, 14:11
На мой взгляд, какая-то странная логика: пользователь еще не закончил ввод новой строки, а Вы уже успели добавить соответствующую строку в БД. А если он впоследствии надумает отменить начатое добавление, то Вам надо будет выполнить обратную операцию удаления строки из БД! А если для строки таблицы определены ограничения NOT NULL для каких-либо колонок, то каким образом, оставаясь в рамках Вашего алгоритма, Вы сможете добавить в БД строку, содержащую только ID? 
Мне кажется, что стоило бы сначала позволить пользователю завершить процесс добавления новой строки, а потом уже сохранять ее в таблице БД. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)