我有一个来自数据表的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;
}
}
使用上面的代码,我仍然可以在数量单元格中得到负值甚至零值。
非常感谢帮助 感谢
答案 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";
这给出了明确的指示:
您还可以使用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即可获得更多控制权。即使行标题不可见,这也会起作用。