Проверка DataGridView и изменение значения ячейки
-
13-10-2019 - |
Вопрос
Я хотел бы манипулировать ячейкой в своем DataGridView во время ее проверки, чтобы, если пользователь вводит значение, которое недопустимо для базы данных, но легко преобразуется в действительные данные, программа меняет значение на подходящее.
Я могу правильно проверить свое значение, но когда я пытаюсь изменить его на что-то действительное, я получаю ошибку DataError.Вот мой код:
private void unit_List_2_GroupsDataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
Console.WriteLine("Validating");
DataGridViewColumn col = this.unit_List_2_GroupsDataGridView.Columns[e.ColumnIndex];
DataGridViewCell cell = this.unit_List_2_GroupsDataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex];
if (col == this.batchDataGridViewTextBoxColumn && this.unit_List_2_GroupsDataGridView.IsCurrentCellInEditMode)
{
Console.WriteLine(" Batch Column");
DataRow[] rows = label_EntryDataSet.viewJobBatchList.Select(String.Format("Job={0} AND Display='{1}'"
, comboBox1.SelectedValue, e.FormattedValue));
if (rows.Length == 1)
{
Console.WriteLine(" Auto Completed item from list: {0}", rows[0]["Batch"]);
//e.Cancel = true;
cell.Value = rows[0]["Batch"];
//this.unit_List_2_GroupsDataGridView.EndEdit();
}
else
{
Console.WriteLine(" No Autocomplete!");
int i = 0;
if (!int.TryParse(e.FormattedValue.ToString(), out i))
{
Console.WriteLine(" Not an integer either");
e.Cancel = true;
}
}
}
}
Строка, которая читает cell.Value = rows[0]["Пакет"]; не делает того, что я от него ожидаю.
Решение
А CellValidating
событие происходит непосредственно перед тем, как DataGridView
выходит из режима редактирования;это событие, которое связано с элементом управления редактированием или включает его (DataGridView.EditingControl
).Никогда не пытайтесь изменить значение ячейки в обработчике этого события, поскольку, если вы не отмените событие (в этом случае пользователь зависнет в режиме редактирования), значение ячейки будет установлено на значение из элемента управления редактированием сразу после событие заканчивается.Таким образом, это отменяет любые действия, выполняемые вами в обработчике.
Вместо этого вам нужно изменить значение в элементе управления редактированием (не забывая не отменять событие).Например, для DataGridViewTextBoxCell
, вы должны использовать следующее вместо проблемной строки:
unit_List_2_GroupsDataGridView.EditingControl.Text = Convert.ToString(rows[0]["Batch"]);
Вы должны обнаружить, что это решает вашу проблему.
Другие советы
В общем, лучше использовать Анализ ячейки событие всякий раз, когда вам нужно преобразовать/изменить значение в ячейке.Из этого события вы можете указать, что значение пользователя недействительно, установив параметр Текст ошибки значение ячейки или строки.