Только первая строка обновления datagridview c#

#c# #record

#c# #запись

Вопрос:

Ниже приведен мой код для обновления записей в моей инвентарной таблице (ItemId задается как первичный ключ). Код работает правильно, однако он обновляет только первую строку в datagridview.

Теперь, когда я пытаюсь обновить другие записи (кроме 1-й строки), я получаю это сообщение об ошибке: «Столбец ‘ItemId’ ограничен уникальностью. Значение ‘2’ уже присутствует «. Но когда я обновляю первую строку, которая равна ‘1’, она успешно обновляется, даже если значение ‘1’ уже существует.

 cb = new SqlCommandBuilder(da);

ds.Tables["Inventory"].Rows[0]["ItemID"] = txtID.Text;
ds.Tables["Inventory"].Rows[0]["ItemCode"] = txtCode.Text;
ds.Tables["Inventory"].Rows[0]["Description"] = txtDesc.Text;

da.Update(ds, "Inventory");
ds.Tables["Inventory"].AcceptChanges();
MessageBox.Show("Record updated successfully.");
  

Я думаю, что мне чего-то не хватает в моем коде, любая помощь будет оценена. Спасибо.

Комментарии:

1. Вы жестко кодируете номер строки, чтобы он был строкой 0 (первая строка). Вам нужно получить номер строки, который обновляется в данный момент. А еще лучше, пусть . Net сделает всю эту путаницу за вас, установив свойства источника данных и элемента данных вашей сетки данных

2. что такое ItemId? это первичный ключ?

3. Исключение @UnhandledException Да.

Ответ №1:

Вместо того, чтобы устанавливать ItemId первой строки из вашего DS в текстовое значение, разве вы не должны находить строку в DS, которая соответствует введенному идентификатору. Я предполагаю, что при обновлении любой другой строки, кроме первой, ваш DS дважды получает один и тот же идентификатор.

Перед обновлением:

 Row    ItemId
-----  ------
0      1
1      2
2      3
  

После вашего обновления для itemid 3:

 Row    ItemId
-----  ------
0      3 <-- row 0 now contains id 3 which is a duplicate of row 2
1      2
2      3
  

Я думаю, что код обновления строки будет выглядеть примерно так:

 cb = new SqlCommandBuilder(da);

var itemId = int.Parse(txtID.Text);
var row = ds.Tables["Inventory"].Rows.Find(itemId);
row["ItemCode"] = txtId.Text;
row["Description"] = txtId.Text;

da.Update(ds, "Inventory");
ds.Tables["Inventory"].AcceptChanges();
MessageBox.Show("Record updated successfully.");
  

Комментарии:

1. Да, именно это и произошло, когда я попытался удалить эту строку: ds.Tables[«Inventory»].Rows[0][«ItemId»] = txtID.Text;

2. Попробовал. Работает правильно. Спасибо.