单元格处于编辑模式时删除DataGridView可防止Form关闭

时间:2015-03-09 05:32:49

标签: c# .net multithreading winforms datagridview

我认为这是.NET(4.0和4.5)中的一个错误,我试图解决这个问题。我创建了一个应该重现此问题的小样本。

  1. 点击按钮
  2. 编辑单元格(删除dgv之前的a1或a2)
  3. 等待数据更改为b1和b2。
  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);
        }
    }
    

2 个答案:

答案 0 :(得分:2)

我也可以用.NET 3.5重现你的问题。到目前为止,我无法对这种行为做出解释。当我找到答案时,我会更新答案。

CancelEdit仅丢弃更改,但不会结束对单元格的编辑(但MSDN另有说明)。如果您保留原始DataGridView而不替换其他内容,则可以看到此行为。原始值将恢复,但单元格仍处于编辑模式。

如果您要放弃并结束对单元格的编辑,请像下面一样使用CancelEditEndEdit。通过此更改,表单可以关闭。

dgv.CancelEdit();
dgv.EndEdit();

答案 1 :(得分:1)

dgv.DataSource设置为null对我有用:

if (dgv.IsCurrentCellInEditMode)
{
    dgv.CancelEdit();
    dgv.DataSource = null;
}