仅在按下某个键时才提交DataGridView单元格

时间:2010-11-25 08:11:08

标签: c# .net winforms datagridview

我有一个附加到XML DataSource的DataGridView。每次用户编辑单元格时,程序都会自动更新相关的XML文件。为了处理编辑我正在使用两者:

private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
       //do edit
}
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
       //do edit
}

编辑就是这样,用户点击单元格并更改值。然后他应该按 Enter 键使一切正常,但是例如,如果他在外面单击鼠标按钮,或者如果他用左箭头键移出单元格,则程序会混乱。无论如何它仍然有效,因为我设法处理这个异常,但我希望我的程序更好地处理这种情况。例如,当用户进入一个单元格时,我想拒绝他使用箭头键进入其他单元格。我试图抓住KeyDown事件,但它不起作用:

    private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
    {
        if ((e.KeyCode == Keys.Left) || (e.KeyCode == Keys.Right)) //etc...
        {
            e.Handled = true;
        }
    }

基本上,当开始编辑开始时,我想仅在用户按 Enter 时编辑单元格。有任何想法吗?如果控件(在这种情况下是单元格)在编辑期间失去焦点(用户按下 Esc ,在控件外单击鼠标等...)我需要阻止EndEdit从开始的事件。

2 个答案:

答案 0 :(得分:2)

您可以使用RowValidating事件取消事件,并使用RowValidated事件进行保存,如下所示:

    private void dataGridView1_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
    {
        string data = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
        if(!ValidateData(data))
            e.Cancel = true;
    }

    private bool ValidateData(string data)
    {
        // do validation which u want to do.
    }

    private void dataGridView1_RowValidated(object sender, DataGridViewCellEventArgs e)
    {
        string data = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
        SaveData(data);
    }

    private void SaveData(string data)
    {
        // save data
    }

答案 1 :(得分:1)

而是使用允许您在无效数据的情况下取消操作的RowValidating事件。