【问题标题】:DataGridView validating old value insted of new valueDataGridView 验证旧值而不是新值
【发布时间】:2010-05-13 00:09:55
【问题描述】:

我有一个绑定到 DataTable 的 DataGridView,它有一个双精度列,值需要介于 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。

我再次单击它,尝试离开,这一次它的行为就像它应该的那样,它会为单元格显示错误图标并阻止我离开。我尝试输入正确的值(比如 0.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;
        }
    }
}

【问题讨论】:

    标签: c# validation datagridview


    【解决方案1】:

    您需要使用 DataGridViewCellValidatingEventArgs 实例的 FormattedValue 属性而不是单元格值,因为在验证成功之前不会更新单元格值:

    用户输入的文本通过 用户界面 (UI) 成为 FormattedValue 属性值。这是 您之前可以验证的值 它被解析为单元格值 适当的价值。 (MSDN)

    【讨论】:

    • 不,dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].FormattedValue = ".1" 在我输入 5 之后
    • 不。你需要看看 e.FormattedValue !
    【解决方案2】:

    做这样的事情怎么样?这假设您在 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;
               }
            }
         }
      }
    

    【讨论】:

    • 没问题。我只是对其进行了一些更改以使用文本而不是检查类型。应该给出相同的结果,只是稍微干净一点,但如果它不起作用,请告诉我,我会回复帖子。
    • 它会失败,因为 EditingControll 如果您正在验证并且当前没有正在编辑的框,则可以为空。
    • 好的,我添加了对空 EditingControl 的检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 2013-06-22
    相关资源
    最近更新 更多