我认为这是.NET(4.0和4.5)中的一个错误,我试图解决这个问题。我创建了一个应该重现此问题的小样本。
我想我可以通过简单地取消当前单元格上的编辑来解决这个问题,但表单仍然无法关闭。出于某种原因,e.Cancel是真的。
class DForm : Form {
Button btn = new Button { Text = "Test", Dock = DockStyle.Top };
DataGridView dgv = new DataGridView { Dock = DockStyle.Fill };
public DForm() {
DataTable table = new DataTable();
table.Columns.Add("Field1");
table.Columns.Add("Field2");
table.Rows.Add("a1", "a2");
dgv.DataSource = table;
Controls.Add(btn);
Controls.Add(dgv);
btn.Click += delegate {
MessageBox.Show("Now edit a cell. After the dgv is swapped, try to close the form.");
DataGridView dgv2 = new DataGridView() { Dock = DockStyle.Fill };
DataTable table2 = new DataTable();
table2.Columns.Add("Field1b");
table2.Columns.Add("Field2b");
table2.Rows.Add("b1", "b2");
dgv2.DataSource = table2;
Thread t = new Thread(o => {
Thread.Sleep(2000);
Control c = (Control) o;
c.BeginInvoke((Action) delegate {
if (dgv.IsCurrentCellInEditMode)
dgv.CancelEdit();
this.Controls.Remove(dgv);
dgv.Dispose();
this.Controls.Add(dgv2);
});
});
t.IsBackground = true;
t.Start(this);
};
}
protected override void OnFormClosing(FormClosingEventArgs e) {
if (e.Cancel) {
MessageBox.Show("why???");
return;
}
base.OnFormClosing(e);
}
}
答案 0 :(得分:2)
我也可以用.NET 3.5重现你的问题。到目前为止,我无法对这种行为做出解释。当我找到答案时,我会更新答案。
CancelEdit
仅丢弃更改,但不会结束对单元格的编辑(但MSDN另有说明)。如果您保留原始DataGridView
而不替换其他内容,则可以看到此行为。原始值将恢复,但单元格仍处于编辑模式。
如果您要放弃并结束对单元格的编辑,请像下面一样使用CancelEdit
和EndEdit
。通过此更改,表单可以关闭。
dgv.CancelEdit();
dgv.EndEdit();
答案 1 :(得分:1)
将dgv.DataSource
设置为null
对我有用:
if (dgv.IsCurrentCellInEditMode)
{
dgv.CancelEdit();
dgv.DataSource = null;
}