Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.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# 对DataGridViewCell进行编程值更改后取消编辑不起作用_C#_Winforms_Datagridview_Cancellation - Fatal编程技术网

C# 对DataGridViewCell进行编程值更改后取消编辑不起作用

C# 对DataGridViewCell进行编程值更改后取消编辑不起作用,c#,winforms,datagridview,cancellation,C#,Winforms,Datagridview,Cancellation,最小问题示例中的代码片段: private System.Windows.Forms.DataGridView dataGridView1; private System.Windows.Forms.DataGridViewTextBoxColumn colButtonEditedText; private System.Windows.Forms.DataGridViewButtonColumn ColBrowse; private System.Windows.Forms.DataGridV

最小问题示例中的代码片段:

private System.Windows.Forms.DataGridView dataGridView1;
private System.Windows.Forms.DataGridViewTextBoxColumn colButtonEditedText;
private System.Windows.Forms.DataGridViewButtonColumn ColBrowse;
private System.Windows.Forms.DataGridViewTextBoxColumn colOtherText;


this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
        this.colButtonEditedText,
        this.ColBrowse,
        this.colOtherText});


this.dataGridView1.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellClick);


private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex >= 0 && e.ColumnIndex >= 0
            && dataGridView1.Columns[e.ColumnIndex].GetType() == typeof(DataGridViewButtonColumn))
    {
            dataGridView1.NotifyCurrentCellDirty(true); // needed to make new row appear
            dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex - 1].Value
                = "some value"; // button helps user edit row
    }
}
观察到的行为:

  • 在第一列中键入一个字符
  • 按escape。
    注意:刚才添加的行已取消
  • 按下按钮。
    观察:编辑第一列
  • 按escape。
    观察:行仍处于编辑模式,不会被取消
  • 在同一行的最后一列中键入字符
  • 按escape。
    观察:刚刚添加的行已取消,两次编辑都将消失
  • 如何使步骤4之后的行为与步骤2和步骤6之后的行为相同

    我尝试过的事情:

    dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex - 1].Selected = true;
    dataGridView1.BeginEdit(true);
    dataGridView1.CommitEdit(DataGridViewDataErrorContexts.LeaveControl);
    dataGridView1.EndEdit();
    

    您看到这种行为的原因与控件的焦点有关。单击
    按钮
    单元格将此焦点从
    DataGridView
    中移除,从而防止
    取消编辑
    按预期触发。在
    if语句中,尝试以下操作:

    dataGridView1.NotifyCurrentCellDirty(true);
    dataGridView1.CurrentCell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex - 1];
    dataGridView1.BeginEdit(false);                
    dataGridView1.EditingControl.Text = "some value";
    
    这可能看起来有点不对劲,因为您正在将焦点从
    按钮
    单元格更改为已编辑的单元格,但当您点击Esc时,您将看到所需的行为


    旁注:我将处理
    DataGridView.CellContentClick
    事件-仅当单击
    按钮本身而不是整个单元格时才会触发