У меня есть 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 данные в DataTable.
Я нажимаю на него во второй раз, пытаюсь уехать, и на этот раз это ведет себя как он, должен, это повысить значок ошибки для ячейки и препятствовать тому, чтобы я уехал. Я пытаюсь войти, правильное значение (скажите.7), но Value
все еще будет 3 и нет теперь никакого выхода из ячейки, потому что она заблокирована из-за ошибки, и мой код доступа никогда не будет продвигать новое значение.
Любые рекомендации значительно ценились бы.
РЕДАКТИРОВАНИЕ - Новая версия кода, базирующегося прочь предложения и имитации Stuart стиля использование статьи 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;
}
}
}
Вам необходимо использовать свойство FormattedValue экземпляра DataGridViewCellValidatingEventArgs вместо значения ячейки, поскольку значение ячейки не обновляется до проверки. успешно:
Текст, введенный пользователем через пользовательский интерфейс (UI), становится значением свойства FormattedValue. Это значение, которое вы можете проверить перед преобразованием его в значение свойства Value ячейки. ( MSDN )
Как насчет того, чтобы сделать что-то вроде этого? Это предполагает, что вы используете textbox'ы в вашем datagridview, так что если вы используете какой-либо другой элемент управления, просто измените его на этот. (Хотя я не уверен, почему ответ Stuart Dunkeld не сработал, FormattedValue должно иметь новое значение в нем).
void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (e.ColumnIndex == 0) // dtxtPercentageOfUsersAllowed.Index
{
object should_be_new_value = e.FormattedValue;
double percentage;
if (dgvImpRDP_InfinityRDPLogin.EditingControl != null)
{
string text = dgvImpRDP_InfinityRDPLogin.EditingControl.Text;
if (!double.TryParse(text, 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";
}
else
{
dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].ErrorText = null;
}
}
}
}