Страницы

Поиск по вопросам

четверг, 5 марта 2020 г.

Как сделать чтобы AutoIncrement в dataGridView увеличивался только при добавлении строки

#c_sharp #winforms #datagridview #datatable


Код

   // *** создаю DataTable
dt_028 = new DataTable();

// *** Добавляю поля в DataTable
// поле Автоинкремент
workColumn = dt_028.Columns.Add("ID", typeof(Int32));
workColumn.AutoIncrement = true;
workColumn.AutoIncrementSeed = 1;
workColumn.AutoIncrementStep = 1;

// поля DataTable
dt_028.Columns.Add("pole_name_1", typeof(String));
dt_028.Columns.Add("pole_name_2", typeof(String));
dt_028.Columns.Add("pole_name_3", typeof(String));

// *** Отображаю DataTable в dataGridView
dataGridView1.DataSource = dt_028;


Когда перемещаю курсор в dataGridView с предпоследней строки на последнюю, увеличивается
значение AutoIncrement в поле "ID".
Т.е. переместил курсор на последнюю строку, но строку не добавил, а AutoIncrement
увеличился.

ВОПРОС
Как сделать чтобы автоинкремент увеличивался только при добавлении строки dataGridView,
а не просто при нахождении курсора на последней строке?

СКРИН


    


Ответы

Ответ 1



На самом деле, перемещение на последнюю строку в DataGridView а потом обратно, приводит к тому, что в DataTable, который указан в качестве источника данных, вставляется новая строка. Вставка новой строки приводит к инкременту поля ID, но т.к. строка на самом деле вставлена не была, происходит отклонение последних изменений - DataTable.RejectChanges(), т.е. тех изменений, которые произошли с момента последнего вызова DataTable.AcceptChanges(), при этом значение инкремента не сбрасывается, в связи с чем при новом перемещении на последную строку в DataGridView значение ID не то, которое вы ожидали увидеть. Что можно сделать? Решение № 1 Инкрементировать вручную, т.е. отключить workColumn.AutoIncrement на колонке ID и выставлять значение самостоятельно. private void FormLoad(object sender, EventArgs e) { _dt = new DataTable(); // Подписываемся на событие вставки новой строки. _dt.TableNewRow += DataTableNewRow; _dt.Columns.Add("ID", typeof(int)); _dt.Columns.Add("pole_name_1", typeof(string)); _dt.Columns.Add("pole_name_2", typeof(string)); _dt.Columns.Add("pole_name_3", typeof(string)); _dataGridView.DataSource = _dt; } private void DataTableNewRow(object sender, DataTableNewRowEventArgs dataTableNewRowEventArgs) { // Инкрементируем ID. dataTableNewRowEventArgs.Row["ID"] = _dt.Rows.Count + 1; } Решение № 2 Возложить задачу по генерации ID на вашу БД, что на мой взгляд более правильно. Решение № 3 Вместо типа int использовать тип Guid, при условии необходимости генерации ID на клиенте.

Ответ 2



Убрать автоинкремент у данного столбца. Остаётся лишь: workColumn = dt_028.Columns.Add("ID", typeof(Int32)); Подписать DataTable на событие добавления новой строки: dt_028.TableNewRow += Dt_028_TableNewRow; В обработчике события вставляем нужное значение: private void Dt_028_TableNewRow(object sender, DataTableNewRowEventArgs e) { e.Row["ID"] = dt_028.Rows.Count; } Ещё лучше вообще убрать эту колонку (вариант - сделать её скрытой). А номера строкам давать при сохранении данных в БД/файл. Собственно, а нужны ли вообще эти номера? В БД айдишник должен быть свой. А в файле он не нужен.

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

Отправить комментарий