【问题标题】:Removing DataGridView when cell is in edit mode prevents Form from closing当单元格处于编辑模式时删除 DataGridView 会阻止 Form 关闭
【发布时间】:2015-05-10 05:48:11
【问题描述】:

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

  1. 点击按钮
  2. 编辑单元格(删除 dgv 之前的 a1 或 a2)
  3. 等待数据更改为 b1 和 b2。
  4. 然后尝试关闭表单。

我想我可以通过简单地取消对当前单元格的编辑来解决这个问题,但是表单仍然无法关闭。出于某种原因,e.Cancel 为 true。

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

【问题讨论】:

  • 你有没有尝试调用 table.EndEdit()

标签: c# .net multithreading winforms datagridview


【解决方案1】:

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

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

如果您想放弃并结束单元格的编辑,请使用CancelEditEndEdit,如下所示。通过此更改,表单可以关闭。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-10-03
      • 1970-01-01
      • 2018-11-06
      • 2014-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多