DataGridView, проверяющий старое значение insted нового значения

У меня есть 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;
        }
    }
}
5
задан Scott Chamberlain 12 May 2010 в 15:20
поделиться

2 ответа

Вам необходимо использовать свойство FormattedValue экземпляра DataGridViewCellValidatingEventArgs вместо значения ячейки, поскольку значение ячейки не обновляется до проверки. успешно:

Текст, введенный пользователем через пользовательский интерфейс (UI), становится значением свойства FormattedValue. Это значение, которое вы можете проверить перед преобразованием его в значение свойства Value ячейки. ( MSDN )

4
ответ дан 14 December 2019 в 19:05
поделиться

Как насчет того, чтобы сделать что-то вроде этого? Это предполагает, что вы используете 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;
           }
        }
     }
  }
1
ответ дан 14 December 2019 в 19:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: