当在DataGridView中使用DefaultValuesNeeded时,不能添加新行

本文关键字:不能 添加 新行 DefaultValuesNeeded DataGridView 当在 | 更新日期: 2023-09-27 18:14:57

我有一个问题与datagridview在我的windows窗体应用程序。我设置AllowUserToAddRows=true,所以当用户双击最后一个空白行时,所选单元格进入编辑模式,当用户在textbox列中写入内容时,将添加新行。

这一切都很好,但现在我想,当新行由用户编辑(双击)所有字段都填充默认值,例如使用第一行的值,所以我在我的datagridview上设置DefaultValuesNeeded事件,并在代码后面我填充所选行的所有字段。

问题是,现在没有新的行出现在底部后DefaultValuesNeeded火。

如何解决这个问题?

当在DataGridView中使用DefaultValuesNeeded时,不能添加新行

如果你有一个绑定源到你的DataGridView,你可以在DefaultValuesNeeeded事件处理程序中调用EndCurrentEdit(),用默认值立即提交新行。

    {
        dt = new DataTable();
        dt.Columns.Add("Cat");
        dt.Columns.Add("Dog");
        dataGridView1.AllowUserToAddRows = true;
        dataGridView1.DefaultValuesNeeded += dataGridView1_DefaultValuesNeeded;
        dataGridView1.DataSource = dt;          
    }
    void dataGridView1_DefaultValuesNeeded(object sender, DataGridViewRowEventArgs e)
    {
        var dgv = sender as DataGridView;
        if(dgv == null)
           return;
        e.Row.Cells["Cat"].Value = "Meow";
        e.Row.Cells["Dog"].Value = "Woof";
        // This line will commit the new line to the binding source
        dgv.BindingContext[dgv.DataSource].EndCurrentEdit();
    }

如果你没有绑定源,我们不能使用DefaultValuesNeeded事件,因为它不起作用。但是我们可以通过捕获CellEnter事件来模拟它。

    {
        dataGridView1.Columns.Add("Cat", "Cat");
        dataGridView1.Columns.Add("Dog", "Dog");
        dataGridView1.AllowUserToAddRows = true;
        dataGridView1.CellEnter += dataGridView1_CellEnter;    
    }
    void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
    {
        var dgv = sender as DataGridView;
        if (dgv == null)
            return;
        var row = dgv.Rows[e.RowIndex];
        if (row.IsNewRow)
        {
            // Set your default values here
            row.Cells["Cat"].Value = "Meow";
            row.Cells["Dog"].Value = "Woof";
            // Force the DGV to add the new row by marking it dirty
            dgv.NotifyCurrentCellDirty(true);
        }
    }