在 DataGridView 中使用 DefaultValuesNeeded 时无法添加新行

Posted

技术标签:

【中文标题】在 DataGridView 中使用 DefaultValuesNeeded 时无法添加新行【英文标题】:Can't add new rows when using DefaultValuesNeeded in DataGridView 【发布时间】:2014-07-25 16:03:48 【问题描述】:

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

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

问题是现在 DefaultValuesNeeded 触发后底部没有新行出现。

我该如何解决这个问题?

【问题讨论】:

你的 DataGridView 有绑定源吗? 【参考方案1】:

如果您有 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);
        
    

【讨论】:

谢谢,但我没有绑定源,用户通过编辑字段和添加新行将数据添加到我的网格视图中 @tulkas85 我添加了一个关于如何在没有绑定源的情况下执行此操作的部分

以上是关于在 DataGridView 中使用 DefaultValuesNeeded 时无法添加新行的主要内容,如果未能解决你的问题,请参考以下文章

如何在同一个datagridview中多次使用定义的datagridview单元格

使用数据绑定控件在 DataGridView 中添加行

如何使用 C# 在 datagridview 控件中显示某些表架构列?

怎么在VB中添加datagridview控件

如何在 C# WinForms 中使用 LINQ 从 DataGridView 中选择多个字段

在 DataGridView 中使用 DefaultValuesNeeded 时无法添加新行