У меня есть DataGridView, который связан с DataTable, у него есть двойной столбец, и значения должны быть между 0 и 1. Вот мой код
private void dgvImpRDP_InfinityRDPLogin_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (e.ColumnIndex == dtxtPercentageOfUsersAllowed.Index)
{
double percentage;
if(dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].Value.GetType() == typeof(double))
percentage = (double)dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].Value;
else if (!double.TryParse(dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].Value.ToString(), out percentage))
{
e.Cancel = true;
dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].ErrorText = "The value must be between 0 and 1";
return;
}
if (percentage < 0 || percentage > 1)
{
e.Cancel = true;
dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].ErrorText = "The value must be between 0 and 1";
}
}
}
Однако моя проблема, когда dgvImpRDP_InfinityRDPLogin_CellValidating
срабатывает dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].Value
будет содержать старое значение перед редактированием, а не новое значение.
Например, допустим, старое значение было .1, а я ввожу 3. Приведенный выше код запускается при выходе из ячейки, и dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].Value
будет .1 для этого запуска, код проверяется и записывается 3 данные в таблицу данных.
Я нажимаю на него второй раз, пытаюсь уйти, и на этот раз он ведет себя так, как должен, он поднимает значок ошибки для ячейки и мешает мне уйти. Я пытаюсь ввести правильное значение (скажем, 0,7), но значение Value
все равно будет равно 3, и теперь нет выхода из ячейки, поскольку он заблокирован из-за ошибки, и мой код проверки никогда не будет выдвигать новое значение .
Буду признателен за любые рекомендации.
РЕДАКТИРОВАТЬ -
Новая версия кода основана на предложении Стюарта и имитирует стиль, используемый в статье MSDN. По-прежнему ведет себя так же.
private void dgvImpRDP_InfinityRDPLogin_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (e.ColumnIndex == dtxtPercentageOfUsersAllowed.Index)
{
dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].ErrorText = String.Empty;
double percentage;
if (!double.TryParse(dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].FormattedValue.ToString(), out percentage) || percentage < 0 || percentage > 1)
{
e.Cancel = true;
dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].ErrorText = "The value must be between 0 and 1";
return;
}
}
}