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

Поиск:

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 15.7.2008
Где: Россия, Москва

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



Всем привет!

Кинул на форму DataGridView, привязал его к DataTable, а в DataTable через DataAdapter данные из БД грузятся.

1) При удалении не удаляется последняя запись (то есть, когда в DataGridView осталась всего 1 запись, то она не удаляется физически из БД, а если записей больше чем 1, то они нормально удаляются). Если удалять эту запись, то событие удаление строки вообще не отрабатывается.
2) Иногда выскакивают ошибки параллелизма при изменении (Нарушение параллелизма: UpdateCommand затронула 0 из ожидаемых 1 записей.)

Все sql-команды в адаптере прописаны (Insert, Update, Delete) и работают нормально

Вот мой код:



Код

...........

//ДатаАдаптер
public WorkersDataSetTableAdapters.OboznTableAdapter ota = new global::Tabel.WorkersDataSetTableAdapters.OboznTableAdapter();
//Таблица
public WorkersDataSet.OboznDataTable table = new WorkersDataSet.OboznDataTable();

.........

private void Obozn_Load(object sender, EventArgs e)
{
     ota.FillObozn(table);
     data.DataSource = table;  //data - это DataGridView
}


private void data_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            DataTable t = table.GetChanges(DataRowState.Added | DataRowState.Modified);
            if (t != null)
            {
                ota.Adapter.Update(t);
                table.AcceptChanges();
            }
        }

        private void data_UserDeletedRow(object sender, DataGridViewRowEventArgs e)
        {
            DataTable t = table.GetChanges(DataRowState.Deleted);
            if (t != null)
            {
                ota.Adapter.Update(t);
                table.AcceptChanges();
            }
        }



Уже читал кучу статей, МСДН, но ответа не нашел. Если делать вручную удаление и редактирование строк (то есть самому выполнять sql-команды с передачей нужных параметров) то все работает отлично. Но так я не хочу делать, я хочу чтобы Адаптер сам вызывал нужные команды в нужных обработчиках событий.

С этой проблемой борюсь уже не первый месяц. И не второй даже.

Помогите решить проблему. Может кто код выложит, какой он код пишет в обработчиках событий.

Это сообщение отредактировал(а) ZneP - 9.6.2009, 12:16
PM MAIL ICQ Skype   Вверх
ZneP
Дата 10.6.2009, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 15.7.2008
Где: Россия, Москва

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



Сам разобрался
PM MAIL ICQ Skype   Вверх
ZneP
Дата 30.6.2009, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 15.7.2008
Где: Россия, Москва

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



Немного с запазданием, но все же. На случай, если кому-то понадобиться решение данной проблемы.


Я сделал так.

Для редактирования ячейки добавил 2 события DataGridView:

Код

//Обработка двойного клика на ячейку
private void data_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
     //Переходим в режим редактирования ячейки. data - это DataGridView
     data.BeginEdit(true);
}

//Обработка события по завершению редактирования ячейки
private void data_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
     //Получаем добавленные и измененные ячейки из таблицы.
     //table - это таблица, которая является источником данных для data
     DataTable t = table.GetChanges(DataRowState.Added | DataRowState.Modified);
     if (t != null)
     {
          try
          {
               //Вызываем SQL-запросы добавления и изменения для соответствующих строк. ota - это DataAdapter
               ota.Adapter.Update(t);
               //Заполняем источник данных. Функция AcceptChanges() выполняется автоматически
               ota.Fill(table);
          }
          catch (Exception ex)
          {
               MessageBox.Show(ex.Message);
          }
      }
}


-------------------------------------------------------------------------------------------------------------------------------------------

Для удаления строк добавил обработчик события удаления

Код

private void data_UserDeletedRow(object sender, DataGridViewRowEventArgs e)
{
     //Получаем строки, которые были удалены
     DataTable t = table.GetChanges(DataRowState.Deleted);
     if (t != null)
     {
          try
          {
               //Вызываем SQL-запрос удаления соответствующих строк
               ota.Adapter.Update(t);
               //Вызываем функцию AcceptChanges, так как не делаем перезаполнение источника данных (Fill)
               table.AcceptChanges();
          }
          catch (Exception ex)
          {
               MessageBox.Show(ex.Message);
          }
     }
}


-------------------------------------------------------------------------------------------------------------------------------------------

А чтобы решить проблему с удалением последней строки из DataGridView, то я добавил обработчик на закрытие окна, в котором выбрал все
измененные, удаленные и добавленные строки и вызвал соответствующие SQL-запросы к ним.

Код

private void FormClosing(object sender, FormClosingEventArgs e)
{
     DataTable t = table.GetChanges();
     if (t != null)
     {
          try
          {
               ota.Adapter.Update(t);
          }
          catch (Exception ex)
          {
               MessageBox.Show(ex.Message);
          }
     }
}


Это сообщение отредактировал(а) ZneP - 30.6.2009, 09:27
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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