编程值更改为 DataGridViewCell 后取消编辑不起作用
CancelEdit after Programmatic value change to a DataGridViewCell does not work
最小问题示例的代码片段:
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
}
}
观察到的行为:
- 在第一列中输入一个字符。
- 按退出键。
观察:您刚添加的行已取消。
- 按下按钮。
观察:第一列已编辑。
- 按退出键。
观察:行仍处于编辑模式且未取消。
- 在同一行的最后一列中键入一个字符。
- 按退出键。
观察:您刚添加的行被取消,两个编辑都消失了。
如何使第 4 步后的行为与第 2 步和第 6 步后的行为相同?
我尝试过的事情:
dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex - 1].Selected = true;
dataGridView1.BeginEdit(true);
dataGridView1.CommitEdit(DataGridViewDataErrorContexts.LeaveControl);
dataGridView1.EndEdit();
您看到此行为的原因与 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
本身而不是整个单元格被点击时触发。
最小问题示例的代码片段:
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
}
}
观察到的行为:
- 在第一列中输入一个字符。
- 按退出键。
观察:您刚添加的行已取消。 - 按下按钮。
观察:第一列已编辑。 - 按退出键。
观察:行仍处于编辑模式且未取消。 - 在同一行的最后一列中键入一个字符。
- 按退出键。
观察:您刚添加的行被取消,两个编辑都消失了。
如何使第 4 步后的行为与第 2 步和第 6 步后的行为相同?
我尝试过的事情:
dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex - 1].Selected = true;
dataGridView1.BeginEdit(true);
dataGridView1.CommitEdit(DataGridViewDataErrorContexts.LeaveControl);
dataGridView1.EndEdit();
您看到此行为的原因与 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
本身而不是整个单元格被点击时触发。