以C#win形式验证DataGridView

时间:2015-05-08 05:03:31

标签: c# winforms datagridview validating

我有一个来自数据表的DataGridView。我试图阻止用户从datagridview输入非数字或负整数或双精度到不同的列。

我知道CellValidating方法是常用的,但我似乎无法捕获负值。

private void datagridview1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
    {
        string headerText = datagridview1.Columns[e.ColumnIndex].HeaderText;

        // Abort validation if cell is not in the Age column.
        if (!headerText.Equals("Quantity")) return;

        int output;

        // Confirm that the cell is an integer.
        if (!int.TryParse(e.FormattedValue.ToString(), out output))
        {
                MessageBox.Show("Quantity must be numeric");
                e.Cancel = true;
        }
        else if (output <= 0)
        {
            MessageBox.Show("Quantity must not be negative");
            e.Cancel = true;
        }
    }

使用上面的代码,我仍然可以在数量单元格中得到负值甚至零值。

非常感谢帮助 感谢

2 个答案:

答案 0 :(得分:1)

我认为您应该在取消事件后放置MessageBox代码。

因为当MessageBox弹出时,它会失去Cell的焦点,失去焦点就不会让事件Cancel

// Confirm that the cell is an integer.
if (!int.TryParse(e.FormattedValue.ToString(), out output))
{                
        e.Cancel = true;
        MessageBox.Show("Quantity must be numeric");
}
else if (output <= 0)
{            
    e.Cancel = true;
    MessageBox.Show("Quantity must not be negative");
}

答案 1 :(得分:1)

我认为正确的方法是使用ErrorText属性。

dataGridView1.Rows[e.RowIndex].ErrorText = "Quantity must not be negative";

这给出了明确的指示: enter image description here

您还可以使用CellEndEdit事件:

void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            // Clear the row error in case the user presses ESC.   
            dataGridView1.Rows[e.RowIndex].ErrorText = string.Empty;
        }

当行标题不可见时:

在这种情况下,验证仍然有效,但不会显示错误消息和图标。使用this approach和CellEndEdit即可获得更多控制权。即使行标题不可见,这也会起作用。