阻止DataGridView提交新的空白行

时间:2015-11-08 16:25:10

标签: c# winforms datagridview

我有一个未绑定的DGV用户可以添加行。

默认情况下,网格底部有一个空行。我们称之为X行。 当用户开始编辑行X中的单元格时,会在其下方添加一个新的空白行(X + 1)。

new blank row added when editing cell

但是在添加新行之后,可以删除行X中的所有文本并将其留空。网格留下2个连续的空白行。

2 blank rows left when leaving cell

使用CellEndEdit事件,我尝试:

  1. 删除行X - 得到InvalidOperationException:操作无效,因为它导致对SetCurrentCellAddressCore函数的可重入调用。
  2. 删除第X + 1行 - 得到InvalidOperationException:无法删除未提交的新行。
  3. 无法使用CellValueChanged事件,因为null到null不被视为更改。

    有没有办法防止此行为/确保始终只存在一个空行? 谢谢!

1 个答案:

答案 0 :(得分:0)

第一个错误告诉您,如果其中一个单元格具有当前焦点,则无法删除该行。因此,在CellEndEdit上,将CurrentCell设置为上面一行中的一个单元格(在尝试删除该行之前)。

编辑:示例代码

public class FormClick : Form {

    DataGridView dgv = new DataGridView { Dock = DockStyle.Fill };
    DataTable table = new DataTable();

    public FormClick() {
        table.Columns.Add("A");
        table.Columns.Add("B");
        dgv.DataSource = table;
        Controls.Add(dgv);

        dgv.CellEndEdit += dgv_CellEndEdit;
    }

    void dgv_CellEndEdit(object sender, DataGridViewCellEventArgs e) {

        DataRow row = ((DataRowView) dgv.Rows[e.RowIndex].DataBoundItem).Row;
        bool allEmpty = true;
        for (int i = 0; i < table.Columns.Count; i++) {
            String s = row[i].ToString();
            if (s.Length > 0) {
                allEmpty = false;
                break;
            }
        }
        if (allEmpty) {
            dgv.Rows.RemoveAt(e.RowIndex);
        }
    }
}