#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; } Ещё лучше вообще убрать эту колонку (вариант - сделать её скрытой). А номера строкам давать при сохранении данных в БД/файл. Собственно, а нужны ли вообще эти номера? В БД айдишник должен быть свой. А в файле он не нужен.
Комментариев нет:
Отправить комментарий