【问题标题】:CancelEdit after Programmatic value change to a DataGridViewCell does not work将编程值更改为 DataGridViewCell 后的 CancelEdit 不起作用
【发布时间】:2016-12-07 19:42:46
【问题描述】:

来自最小问题示例的代码 sn-ps:

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
    }
}

观察到的行为:

  1. 在第一列中键入一个字符。
  2. 按退出键。
    注意:您刚刚添加的行已取消。
  3. 按下按钮。
    注意:第一列已编辑。
  4. 按退出键。
    观察:行保持在编辑模式并且没有被取消。
  5. 在同一行的最后一列中键入一个字符。
  6. 按退出键。
    观察:您刚刚添加的行被取消,两个编辑都消失了。

如何使第 4 步后的行为与第 2 步和第 6 步后的行为相同?

我尝试过的事情:

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

【问题讨论】:

    标签: c# winforms datagridview cancellation


    【解决方案1】:

    您看到此行为的原因与 Control 的焦点有关。单击Button 单元格会将此焦点从DataGridView 中移除,从而防止CancelEdit 按预期触发。在您的 if-statement 中,尝试以下操作:

    dataGridView1.NotifyCurrentCellDirty(true);
    dataGridView1.CurrentCell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex - 1];
    dataGridView1.BeginEdit(false);                
    dataGridView1.EditingControl.Text = "some value";
    

    由于您将焦点从Button 单元格更改为已编辑的单元格,因此这可能看起来有点笨拙,但是当您点击 Esc 时,您会看到所需的行为。


    旁注:我会改为处理 DataGridView.CellContentClick 事件 - 仅当 Button 本身而不是整个单元格被点击时才会触发。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-21
      • 2014-06-25
      • 1970-01-01
      • 2016-11-06
      相关资源
      最近更新 更多