VB.net中的DataGridView不允许更新

VB.net中的DataGridView不允许更新,vb.net,datagridview,Vb.net,Datagridview,我有一个datagridview,其中dataTable作为数据源。用户可以向datagridview添加新行,但我不显示主键列(出于明显的原因),并将其设置为.visible=false。当我需要将datagridview中的信息更新到数据库时,我使用sqlClient.SqlCommandBuilder来更新底层数据源(上面提到的数据表) 现在,因为隐藏列是主键,所以我在datagridview中循环,并以编程方式将所需的主键字段添加到尚未包含主键的每一新行(用户添加的行)。这在95%的情况

我有一个datagridview,其中dataTable作为数据源。用户可以向datagridview添加新行,但我不显示主键列(出于明显的原因),并将其设置为
.visible=false
。当我需要将datagridview中的信息更新到数据库时,我使用
sqlClient.SqlCommandBuilder
来更新底层数据源(上面提到的数据表)

现在,因为隐藏列是主键,所以我在datagridview中循环,并以编程方式将所需的主键字段添加到尚未包含主键的每一新行(用户添加的行)。这在95%的情况下都很有效

问题在于,当用户以某种方式将焦点放在datagridview上的某个点(任意点)上,在其添加的行下面,用于添加新行。update命令给了我一个错误,指出它不能将null插入主键字段,即使在检查每一行中的所有值时,它们中的任何一个都肯定不是null

我已尝试捕获
行。isNewRow
(因为字段从不显示null)并删除该行,但我收到一个错误,说明我无法删除未提交的行。如果从未将焦点指定给现有行和用户添加行下的空行,则更新工作正常


怎么回事

> P>听起来好像你的代码试图从数据库中删除空白的新行,但是它还没有在数据库中;它是“分离的”,并且就在DataGridView的内存中。。。这就是你需要移除它的地方。您可以在验证事件中使用一行代码来完成此操作,当然,在保存之前会(或应该)调用该行代码

处理此问题的一种方法是提示用户完全填写新行:

Private Sub dataGridView1_RowValidating(ByVal sender As Object, ByVal e As DataGridViewCellCancelEventArgs)
    If dataGridView1.Rows(e.RowIndex) IsNot Nothing AndAlso Not dataGridView1.Rows(e.RowIndex).IsNewRow Then
        Dim [error] As String = ""

        If dataGridView1.Rows(e.RowIndex).Cells("Field1").Value Is Nothing OrElse dataGridView1.Rows(e.RowIndex).Cells("Field1").Value.ToString().Trim() = "" Then
            [error] += " * Field #1" & vbLf
        End If

        If dataGridView1.Rows(e.RowIndex).Cells("Field2").Value Is Nothing OrElse dataGridView1.Rows(e.RowIndex).Cells("Field2").Value.ToString().Trim() = "" Then
            [error] += " * Field #2" & vbLf
        End If

        If [error] <> "" Then
            MessageBox.Show("The following required fields were left blank:" & vbLf & vbLf & [error], "Row Validation Error", MessageBoxButtons.OK, MessageBoxIcon.[Error])
            e.Cancel = True
        End If
    End If
End Sub
第三种常见的处理方法是,在不执行任何操作的情况下,让您的验证取消对当前行的编辑:

Private Sub dataGridView1_RowValidating(ByVal sender As Object, ByVal e As DataGridViewCellCancelEventArgs)
    Dim drv As DataRowView = TryCast(dataGridView1.CurrentRow.DataBoundItem, DataRowView)
    If drv IsNot Nothing AndAlso drv(0) = DBNull.Value Then
        drv.CancelEdit()
        e.Cancel = True
    End If
End Sub
(另请注意:如果您的主键(a/k/a identity)字段设置为自动编号,您可能会发现ADO.NET在保存过程中能够更好地处理获取下一个id等详细信息。有关更多信息,请查看和。)

专用子dataGridView1\u(ByVal发送方作为对象,ByVal e作为DataGridViewCellCancelEventArgs)
如果dataGridView1.Rows(e.RowIndex)不是Nothing,也不是dataGridView1.Rows(e.RowIndex).IsNewRow,则
Dim[错误]为字符串=“”
如果dataGridView1.Rows(e.RowIndex).Cells(“Field1”).Value为Nothing或LSE dataGridView1.Rows(e.RowIndex).Cells(“Field1”).Value.ToString().Trim()=“”则
[错误]+=“*字段#1”&vbLf
如果结束
如果dataGridView1.Rows(e.RowIndex).Cells(“Field2”).Value为Nothing或LSE dataGridView1.Rows(e.RowIndex).Cells(“Field2”).Value.ToString().Trim()=“”则
[错误]+=“*字段#2”和vbLf
如果结束
如果[错误]”“那么
Show(“以下必填字段留空:”&vbLf&vbLf&[error],“行验证错误”,MessageBoxButtons.OK,MessageBoxIcon.[error])
e、 取消=真
如果结束
如果结束
端接头

请描述此代码如何回答问题。
Private Sub dataGridView1_RowValidating(ByVal sender As Object, ByVal e As DataGridViewCellCancelEventArgs)
    Dim drv As DataRowView = TryCast(dataGridView1.CurrentRow.DataBoundItem, DataRowView)
    If drv IsNot Nothing AndAlso drv(0) = DBNull.Value Then
        drv.CancelEdit()
        e.Cancel = True
    End If
End Sub
Private Sub dataGridView1_RowValidating(ByVal sender As Object, ByVal e As DataGridViewCellCancelEventArgs)
    If dataGridView1.Rows(e.RowIndex) IsNot Nothing AndAlso Not dataGridView1.Rows(e.RowIndex).IsNewRow Then
        Dim [error] As String = ""

        If dataGridView1.Rows(e.RowIndex).Cells("Field1").Value Is Nothing OrElse dataGridView1.Rows(e.RowIndex).Cells("Field1").Value.ToString().Trim() = "" Then
            [error] += " * Field #1" & vbLf
        End If

        If dataGridView1.Rows(e.RowIndex).Cells("Field2").Value Is Nothing OrElse dataGridView1.Rows(e.RowIndex).Cells("Field2").Value.ToString().Trim() = "" Then
            [error] += " * Field #2" & vbLf
        End If

        If [error] <> "" Then
            MessageBox.Show("The following required fields were left blank:" & vbLf & vbLf & [error], "Row Validation Error", MessageBoxButtons.OK, MessageBoxIcon.[Error])
            e.Cancel = True
        End If
    End If
End Sub