绑定DataGridView没有按预期更新第一行(其他行正常)

时间:2018-04-02 01:50:33

标签: .net vb.net winforms datagridview

我成功创建了一个可重复使用的 DataGridView 窗体,允许最终用户排序,添加/删除列,多列过滤并保存设置以应用于下一个程序运行。然而,我成功了......

我使用未绑定的DGV进行用户数据输入/编辑,因为我使用第0行作为列过滤字符串,因为据我所知,我无法将这样的行添加到绑定的DGV。

要更新sql表,我正在使用绑定的DGV镜像未绑定的DGV,并在每个单元格编辑时更新绑定的DGV。绑定的DGV(在开发期间屏幕上,一旦完成就会被隐藏)在100%的时间内准确地反映来自未绑定DGV的数据的镜像副本。

在保存时,绑定DGV中的第一行不会更新表,除非我更改2个单元格中的数据 ,如果我只更改一个单元格中的值它会不救。 在任何其他行上,即使我只更改一个单元格也没有任何问题,只是如果只有一个单元格发生更改,则第一行不会更新。一直在寻找解决方案,尝试了很多东西,如果只更新了一个单元格,我仍然不知道如何正确保存第一行。

有人有什么想法吗?

 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  data1connection = New SqlConnection(cConn)
  data1ds.Clear()
  data1connection.Open()
  data1adapter = New SqlDataAdapter(Me.SQLQ, data1connection)
  data1adapter.Fill(data1ds)
  data1connection.Close()
  DGVBound.DataSource = data1ds.Tables(0)
  DGVBound.ClearSelection()

  Using conn As New SqlConnection(cConn)
     Dim command As New SqlCommand(Me.cSQLQ, conn)
     conn.Open()
     Dim RS As SqlDataReader = command.ExecuteReader()

     'set column headers
     DGVUnbound.ColumnCount = RS.FieldCount()
     Dim f = RS.FieldCount() - 1
     For x = 0 To f
        DGVUnbound.Columns(x).Name = RS.GetName(x)
     Next x

     'add blank filter row
     Dim myList As New List(Of String)()
     For x = 0 To f
        myList.Add("")
     Next x
     Dim myArray As String() = myList.ToArray()
     DGVUnbound.Rows.Add(myArray)
     DGVUnbound.Rows(0).DefaultCellStyle.BackColor = Color.Beige

     'add rows of data
     While RS.Read()
        myList = New List(Of String)()
        For x = 0 To f
           myList.Add(RS(x).ToString)
        Next x
        Dim myArray1 As String() = myList.ToArray()
        DGVUnbound.Rows.Add(myArray1)
        RowCount = RowCount + 1
     End While
  End Using

  LoadUserPrefs()
  AddHandler DGVUnbound.ColumnWidthChanged, AddressOf SaveUserPrefs
  AddHandler DGVUnbound.ColumnDisplayIndexChanged, AddressOf SaveUserPrefs    
End Sub

Sub Mirror() Handles DGVUnbound.CellValueChanged
  If DGVUnbound.CurrentRow.Index <> 0 Then
     Dim cColValue = DGVUnbound.CurrentCell.Value
     Dim cColName = DGVUnbound.CurrentCell.OwningColumn.Name
     Dim cKeyValue = DGVUnbound.CurrentRow.Cells(DGVUnbound.Columns.Item(Me.cKeyCol).Index).Value
     Dim x = DGVBound.Columns.Item(cColName).Index

     For Each row As DataGridViewRow In DGVBound.Rows
        If row.Cells(DGVBound.Columns.Item(Me.cKeyCol).Index).Value = cKeyValue Then
           'update cell
           DGVBound.ClearSelection()
           DGVBound.Rows(row.Index).Cells(x).Selected = True

           DGVBound.EditMode = DataGridViewEditMode.EditProgrammatically
           DGVBound.BeginEdit(True)
           row.Cells(DGVBound.Columns.Item(cColName).Index).Value = cColValue
           DGVBound.EndEdit()
           DGVBound.CommitEdit(DataGridViewDataErrorContexts.Commit)
           'Next line fixed issue:
           DGVUnbound.Select
        End If
     Next
  End If
 End Sub

Private Sub Save_Click(sender As Object, e As EventArgs) Handles Save.Click
  data1cmdBuilder = New SqlCommandBuilder(data1adapter)
  data1changes = data1ds.GetChanges()
  If data1changes IsNot Nothing Then
     data1adapter.Update(data1changes)
  End If
End Sub

1 个答案:

答案 0 :(得分:0)

通过DGVUnbound.Select()修复问题以编程方式将焦点切换回DGVUnbound。更新了上面的代码以反映。