4

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

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

4

2 回答 2

4

好的,我相信我现在明白了。我在 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";
            }
        }
    }
}
于 2013-02-28T09:46:39.223 回答
1

添加检查验证的行是否为 aNewRow并返回如果是。

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";
        }
    }
}
于 2013-02-27T13:13:40.353 回答