我成功创建了一个可重复使用的 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
答案 0 :(得分:0)
通过DGVUnbound.Select()修复问题以编程方式将焦点切换回DGVUnbound。更新了上面的代码以反映。