C# DataGridView验证-删除错误指示器

C# DataGridView验证-删除错误指示器,c#,winforms,validation,datagridview,C#,Winforms,Validation,Datagridview,我正在使用以下代码验证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]

我正在使用以下代码验证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";
            }
        }
    }
}

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

添加检查验证行是否为a,并返回是否为

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";
        }
    }
}

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

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";
            }
        }
    }
}

谢谢你的尝试,这几乎奏效了,但是有一个不好的副作用。添加该代码后,如果我在新行中输入一个无效值,然后再次向下移动到现在的新行中,则错误指示器不会显示在刚才输入的无效行中,直到我再次移出新行为止。@BrendanReynolds不是忽略新行的所有验证,而是仅在
[code column]&&(!IsNewRow | |!e.FormattedValue.IsEmpty)
感谢到目前为止的所有建议。仍然没有。请参阅添加到上述原始问题中的修改后的代码。(由于空间限制,无法在注释中发布)。