【问题标题】:DataGridView Validation - remove error indicatorDataGridView 验证 - 删除错误指示器
【发布时间】:2013-02-27 13:05:20
【问题描述】:

我正在使用以下代码验证 DataGridView ...

void centreDataGridView_CellValidating(object sender, 
    DataGridViewCellValidatingEventArgs e)
{
    if (centreDataGridView.Columns[e.ColumnIndex].Name == "code")
    {
        Regex codeRegex = new Regex("^[0-9]{5}[0-9A-Z]$");
        if (!codeRegex.IsMatch(e.FormattedValue.ToString()))
        {
            centreDataGridView.Rows[e.RowIndex].ErrorText = "error text here";
        }
    }
}

void centreDataGridView_CellEndEdit(object sender, 
    DataGridViewCellEventArgs e)
{
    centreDataGridView.Rows[e.RowIndex].ErrorText = string.Empty;
}

这可行,但如果我输入新行然后再次离开而不输入任何数据,则错误警告图标在新行选择器中仍然可见。如何清除?

根据目前收到的建议,我将上面的代码修改如下...

void centreDataGridView_CellValidating(object sender, 
    DataGridViewCellValidatingEventArgs e)
{
    if (centreDataGridView.Columns[e.ColumnIndex].Name == "code")
    {
        if (!(centreDataGridView.Rows[e.RowIndex].IsNewRow) || 
            (e.FormattedValue.ToString() != string.Empty))
        {
            Regex codeRegex = new Regex("^[0-9]{5}[0-9A-Z]$");
            if (!codeRegex.IsMatch(e.FormattedValue.ToString()))
            {
                centreDataGridView.Rows[e.RowIndex].ErrorText = "error text here";
            }
        }
    }
}

这确实解决了当没有输入数据时,错误指示器显示在新行旁边的问题。但是,当我输入无效数据时,在输入无效数据后第一次移出该行时,在任何行中都不会显示错误指示符。如果我移出包含无效数据的行,然后移回该行,然后再次移出,则会显示错误指示器。

【问题讨论】:

    标签: c# winforms validation datagridview


    【解决方案1】:

    好的,我相信我现在明白了。我在 CellValidating 事件处理程序的开头而不是在 CellEndEdit 事件处理程序中将 ErrorText 设置为空字符串,如下所示。这基本上是收到的所有建议的组合,所以谢谢大家,这一切都有帮助。

    void centreDataGridView_CellValidating(object sender, 
        DataGridViewCellValidatingEventArgs e)
    {
        centreDataGridView.Rows[e.RowIndex].ErrorText = string.Empty;
        if (centreDataGridView.Columns[e.ColumnIndex].Name == "code")
        {
            if (!(centreDataGridView.Rows[e.RowIndex].IsNewRow) || 
                (e.FormattedValue.ToString() != string.Empty))
            {
                Regex codeRegex = new Regex("^[0-9]{5}[0-9A-Z]$");
                if (!codeRegex.IsMatch(e.FormattedValue.ToString()))
                {
                    centreDataGridView.Rows[e.RowIndex].ErrorText = "blah blah blah";
                }
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      添加检查验证行是否为NewRow,如果是则返回。

      void centreDataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
      {
          if (centreDataGridView.Rows[e.RowIndex].IsNewRow)
          {
              return; // do not validate row that has no values
          }
          if (centreDataGridView.Columns[e.ColumnIndex].Name == "code")
          {
              Regex codeRegex = new Regex("^[0-9]{5}[0-9A-Z]$");
              if (!codeRegex.IsMatch(e.FormattedValue.ToString()))
              {
                  centreDataGridView.Rows[e.RowIndex].ErrorText = "error text here";
              }
          }
      }
      

      【讨论】:

      • 这几乎可以工作,感谢您的尝试,但有一个不良副作用。添加该代码后,如果我在新行中输入无效值,然后再次向下移动到现在的新行中,则错误指示器不会显示在刚刚输入的无效行中,直到我移开再次进入新行。
      • @BrendanReynolds 不是忽略对新行的所有验证,而是仅验证 [code column] && (!IsNewRow || !e.FormattedValue.IsEmpty)
      • 感谢迄今为止的所有建议。还没有完全到那里。请参阅上面添加到原始问题的修改代码。 (由于空间限制,无法在评论中发布)。
      猜你喜欢
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多