DataGridView проверяет старое значение перед новым значением - PullRequest
5 голосов
/ 12 мая 2010

У меня есть 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;
        }
    }
}

Ответы [ 2 ]

4 голосов
/ 12 мая 2010

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

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

1 голос
/ 12 мая 2010

Как насчет того, чтобы сделать что-то подобное? Это предполагает, что вы используете текстовые поля в своем представлении данных, поэтому, если вы используете какой-то другой элемент управления, просто измените его на этот. (Хотя я не уверен, почему ответ Стюарта Данкелда не сработал, новое значение должно иметь 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;
           }
        }
     }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...