Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅当按下某个键时提交DataGridView单元格编辑_C#_.net_Winforms_Datagridview - Fatal编程技术网

C# 仅当按下某个键时提交DataGridView单元格编辑

C# 仅当按下某个键时提交DataGridView单元格编辑,c#,.net,winforms,datagridview,C#,.net,Winforms,Datagridview,我有一个附加到XML数据源的DataGridView。每次用户编辑单元格时,程序都会自动更新相对的XML文件。要处理编辑,我将使用以下两种方法: private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e) { //do edit } private void dataGridView1_CellEndEdit(object sender, DataGridVie

我有一个附加到XML数据源的DataGridView。每次用户编辑单元格时,程序都会自动更新相对的XML文件。要处理编辑,我将使用以下两种方法:

private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
       //do edit
}
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
       //do edit
}
编辑工作就是这样,用户单击单元格并更改值。然后他应该按Enter键使一切正常工作,但例如,如果他在单元格外单击鼠标按钮,或者如果他用左箭头键走出单元格,程序就会出错。它无论如何都能工作,因为我成功地处理了这个异常,但我希望我的程序能更好地处理这种情况。例如,当用户输入一个单元格时,我想拒绝他使用箭头键进入其他单元格。我试图捕获
键下事件,但没有成功:

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

基本上,当开始编辑时,我只想在用户按Enter键时编辑单元格。有什么想法吗?如果控件(在本例中为单元格)在编辑过程中失去焦点(用户按Esc键,在控件外单击鼠标等…)我需要阻止
EndEdit
事件启动。

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

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

您可以使用RowValidating事件取消操作要按以下方式保存的事件和行验证事件:

    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
    }

您可以使用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
    }

这如何确保仅在按下Enter键时保存编辑?问题并不是关于输入数据的验证。您对ValidateData是什么意思?对我来说,任何值都是好的,我只是想防止用户走出选定的单元格。我该如何处理ValidateData?这如何确保仅在按下Enter键时保存编辑?问题并不是关于输入数据的验证。您对ValidateData是什么意思?对我来说,任何值都是好的,我只是想防止用户走出选定的单元格。我该如何处理ValidateData?精确副本:精确副本: