Я собираюсь начать с этого лоскутного тестового приложения:

Не беспокойтесь, это скриншот кода - это просто для информации, как получилось, что я сгенерировал обзор данных с некоторыми данными в нем. Вот как «сделать это правильно» - вы сохраняете свои данные в DataTable и используете сетку для его отображения
Следующий шаг: мы собираемся создать строго типизированный набор данных, доступный для данных, установить его основной ключ, поместите его в форму вместе с сеткой данных, с которой он связан, и мы собираемся заполнить его уникальным образом, дважды щелкнув по существующей сетке. Я смоделировал существующую сетку, как вы сделали. В действительности я хотел бы сделать ОБА эти сетки основанными на строго типизированной таблице данных, но я хотел показать, что вам не нужно, и мой совет по созданию строго типизированной таблицы данных может вписаться в вашу существующую идею вставки данных в просмотр таблицы данных напрямую, пока вы не будете готовы перейти на
Добавьте новый элемент типа DataSet в ваш проект. Щелкните правой кнопкой мыши проект, добавьте .. Новый элемент:

Дайте ему хорошее имя. Нет ничего хуже, чем код, заполненный Form1, DataSet1, GridView3, Button27
Когда он добавлен, дважды щелкните по нему, чтобы открыть область дизайна. Щелкните правой кнопкой мыши на поверхности и добавьте новую таблицу данных:

Дайте ему хорошее имя, несколько раз щелкните его правой кнопкой мыши и добавьте столбцы для всех вас. хотите, Имя, Код, Цена и т. д. c:

Не забудьте также указать им тип данных, поэтому не все является строкой!

Вы сказали, что хотите быть уникальным по имени, поэтому ... Нажмите на серый бит рядом с именем, чтобы строка становится синей, затем щелкните правой кнопкой мыши и выберите «Установить первичный ключ»

Сохраните все, закройте конструктор набора данных, go, чтобы Дизайнер форм, выберите меню ПРОСМОТР, go ДРУГОЕ WINDOWS >> ДАННЫЕ. Вы также можете нажать Shift+Alt+D
Открыть панель ИСТОЧНИКИ ДАННЫХ, найти узел сетки вашего объекта данных (как бы вы его ни называли) и перетащить его на форму
Появилось сетевое представление, связанное с вашим пользовательским датабилем, а также некоторые новые элементы внизу. Вы можете удалить bindingnavigator:

(и переименовать экземпляр набора данных, чтобы он имел более хорошее имя, чем xxxxDataSet1)
Это все, что нам нужно для настройки приемника с датами и сеткой. Давайте отредактируем обработчик событий для двойного щелчка мышью. Я немного покопался и добавил еще одну функцию в качестве демонстрации, что, если строка ЕСТЬ там, мы можем обновить ее, в противном случае мы добавим ее:
private void _dataGridViewSrc_MouseDoubleClick(object sender, MouseEventArgs e)
{
//my source datagrid is bound to a datatable. I use this to retrieve the current row related
//to the row in the grid that was double clicked
DataRow sourceRow = (_dataGridViewSrc.CurrentRow.DataBoundItem as DataRowView)?.Row;
if(sourceRow == null)
return;
//because we made Name the primary key, the strongly typed datatable has a FindByName method
//we pass it the string Name from the source datatable row (a grid row cell value in your case)
NiceNameDataSet.UniqueProductsRow destRow = _niceNameDataSet.UniqueProducts.FindByName((string)sourceRow["Name"]);
//FindByName returns NULL if the row wasn't found
if(destRow == null)
{
//the row isn't there, so add it, using the data from the source row
_niceNameDataSet.UniqueProducts.AddUniqueProductsRow(
(string)sourceRow["Name"],
(string)sourceRow["Code"],
(double)sourceRow["Price"]
);
} else
{
//the row IS there, how about we update the fields using the row that was just clicked?
//this demonstrated how much nicer it is to work with a strongly typed dataset/datatable
//because all the columns have proper Properties, like row.Code, with proeprt datatypes
//like string and double, rather than having to be referred to with a string name like
//row["Code"] and having to be cast from object to string, double all the time: messy
//and error prone
destRow.Code = (string)sourceRow["Code"];
destRow.Price = (double)sourceRow["Price"];
}
}
Я немного изменил цены и коды, чтобы продемонстрировать это другой подвиг. Теперь вы можете дважды щелкнуть любую строку «Хлеб», сколько захотите, и вы получите только одну строку в сетке назначения, и она меняет свои значения взад и вперед:

