检查是否向DataGridView添加了新行,如果是,请获取新行的集合

时间:2014-11-20 21:34:26

标签: vb.net winforms datagridview datagridviewrow

在VB.NET WinForms项目中,我有一个由数据集填充的datagridview。当用户单击按钮时,我需要检查DGV中是否有新行,如果是,则获取要插入数据库的行集合。 (我将DGV属性AllowUserToAddRows设置为True,因此DGV底部有一行。)

最接近任何进展的是以下,这给了我不一致的结果。代码确实从新行获取值 - ,但前提是用户已单击新行。如果焦点没有离开新行,就好像该行没有被添加到幕后的任何新行的集合中。 (单击然后返回新行可以工作)。

If EmployeesDataSet.HasChanges(DataRowState.Modified Or DataRowState.Added) Then
    Dim changesDataSet As DataSet = EmployeesDataSet.GetChanges(DataRowState.Modified Or DataRowState.Added)
    Dim changesTable As DataTable

    For Each changesTable In changesDataSet.Tables
        Console.WriteLine("TableName: " & changesTable.TableName)
        For Each row As DataRow In changesTable.Rows
            Dim column As DataColumn
            For Each column In changesTable.Columns
                Console.Write("Value: " & row(column).ToString() & ControlChars.Tab & ", ")
            Next column
            Console.WriteLine()
        Next
    Next

End If

CaseyWilkins帮助我解决了类似的问题here。在这种情况下,将焦点放在已更改的单元格中需要添加以下代码:

If dgvEmployees.IsCurrentCellDirty Then
    dgvEmployees.CommitEdit(DataGridViewDataErrorContexts.Commit)
End If

鉴于此,我尝试了

If dgvEmployees.IsCurrentRowDirty Then
    dgvEmployees.CommitEdit(DataGridViewDataErrorContexts.Commit)
End If

但是没有这样做。

我不能很好地包含“您必须点击新行以使其工作”的说明! :)

3 个答案:

答案 0 :(得分:1)

试试这个:

dgvEmployees.CurrentCell = Nothing

这将强制dgv验证新行或已编辑的行。在Update命令之前执行此操作。它应该工作。

答案 1 :(得分:0)

新行可能仍处于编辑模式,请尝试:

dgvEmployees.EndEdit();

答案 2 :(得分:0)

LarsTech很接近。需要在DataGridView的BindingSource上调用EndEdit()方法。所以我的解决方案是

EmployeesBindingSource.EndEdit()

在保存按钮的点击事件开始时。

我在this page找到了答案。