我看了网上,然后看到很多类似的文章。我的代码正确地移动了行。这是发生了什么。我运行该程序,然后按UP或DOWN键,选定的行将相应移动,如果单击刚刚移动的行并尝试将其移回,它将移动到数据表中,但不会反映到datagridview上。如果我选择一行,则我永远不会移动,它将移动它,并且datagridview将反映它,但是如果我再次选择同一行并尝试将其移回,它将不会反映在视图上,但是表将被更新。香港专业教育学院试图重置绑定,datagridview.refresh,再次将数据源设置为表。这些都不起作用。任何人都知道为什么会发生这种情况,我如何解决它,以便每次都能反映出变化?
Private Sub UpBtn_Click(sender As Object, e As EventArgs) Handles UpBtn.Click
MoveUpDataRow(StepDGV.CurrentRow.Index)
End Sub
Private Sub MoveUpDataRow(RowIndex As Integer)
Dim OriginalStepNumber As Integer
Dim dv As DataView = StepsData.DefaultView
OriginalStepNumber = CInt(StepDGV.Rows(RowIndex).Cells("StepIDLS").Value)
If RowIndex = 0 Then
'dv(RowIndex - 1)("StepIDLS") = OriginalStepNumber + 1
'dv(RowIndex)("StepIDLS") = OriginalStepNumber - 1
exit Sub
Else
dv(RowIndex - 1).BeginEdit()
dv(RowIndex - 1)("StepIDLS") = OriginalStepNumber
'dv(RowIndex)("StepIDLS") = RowIndex-1
dv(RowIndex - 1).EndEdit()
dv(RowIndex).BeginEdit()
dv(RowIndex)("StepIDLS") = OriginalStepNumber - 1
'dv(RowIndex)("StepIDLS") = RowIndex-1
dv(RowIndex).EndEdit()
End If
dv.Sort = "StepIDLS ASC"
' StepDGV.Rows(RowIndex).Selected = true
'StepDGV.DataSource = StepsData
'StepDGV.Refresh()
StepDGV.ResetBindings()
StepDGV.Refresh()
End Sub
Private Sub downBtn_Click(sender As Object, e As EventArgs) Handles downBtn.Click
MoveDownDataRow(StepDGV.CurrentRow.Index)
End Sub
Private Sub MoveDownDataRow(RowIndex As Integer)
Dim OriginalStepNumber As Integer
Dim dv As DataView = StepsData.DefaultView
OriginalStepNumber = CInt(StepDGV.Rows(RowIndex).Cells("StepIDLS").Value)
If RowIndex = dv.Count - 1 Then
exit Sub
Else
dv(RowIndex + 1).BeginEdit()
dv(RowIndex + 1)("StepIDLS") = OriginalStepNumber
dv(RowIndex + 1).EndEdit()
dv(RowIndex).BeginEdit()
dv(RowIndex)("StepIDLS") = OriginalStepNumber + 1
dv(RowIndex).EndEdit()
End If
dv.Sort = "StepIDLS ASC"
' StepDGV.Rows(RowIndex).Selected = true
'StepDGV.Refresh()
'StepDGV.DataSource = StepsData
'StepDGV.Refresh()
StepDGV.ResetBindings()
StepDGV.Refresh()
End Sub[![screenshot of datagridview for visual aid when going through code][1]][1]
由于您已经对DataView进行了排序,所以使用相同的Index引用设置两个连续的值可能(将)具有未定义的结果,如果在两个不同的directions]中移动,则可能会得到更多的结果。
方法1:
从当前DataView获取两个DataRows的引用,然后使用DataRow引用更改Column的值比较简单(且功能强大:即使已排序的DataView中的DataRow位置发生了变化,DataRow引用也相同。
您无需开始/结束单元格值,这些更改会自动传播。
►在这里,我对两个Button使用相同的Button.Click
处理程序,并根据Button名称确定方向(可以使用其他合适的名称)。
►此行:如果已存储DataTable对象(看起来像),则不需要Dim dView = DirectCast(StepDGV.DataSource, DataTable).DefaultView
。如果是这样,当然可以使用您已经拥有的DataTable引用。
Private Sub btnMoveRowUpDown_Click(sender As Object, e As EventArgs) Handles UpBtn.Click, downBtn.Click If StepDGV.CurrentRow Is Nothing Then Return Dim moveUp As Boolean = DirectCast(sender, Button).Name.Equals("UpBtn") Dim currentRow As Integer = StepDGV.CurrentCell.RowIndex Dim dView = DirectCast(StepDGV.DataSource, DataTable).DefaultView Dim rowCurrent = dView(currentRow).Row Dim colCurrentValue As Integer = CType(rowCurrent("StepIDLS"), Integer) If moveUp Then If currentRow = 0 Then Return Dim rowPrevious = dView(currentRow - 1).Row Dim colPreviousValue As Integer = CType(rowPrevious("StepIDLS"), Integer) rowCurrent("StepIDLS") = colPreviousValue rowPrevious("StepIDLS") = colCurrentValue Else If currentRow = StepDGV.NewRowIndex - 1 Then Return Dim rowNext = dView(currentRow + 1).Row Dim colNextValue As Integer = CType(rowNext("StepIDLS"), Integer) rowCurrent("StepIDLS") = colNextValue rowNext("StepIDLS") = colCurrentValue End If End Sub
方法2:
您可以执行类似的操作来设置DataGridView单元格的值。在这种情况下,您确实需要调用DataGridView.EndEdit()来通知更改,因此更改会立即发生。否则,将在焦点离开CurrentCell
之后传播值更改。
这里的注释:CurrentCell
在类似的情况下(当您必须直接设置DataGridView单元格时)也可能有用。
[您还可以注意到,设置DataRow Colums值也会更改DataGridView Bound DataGridView not updating to display information + sorting issues(而不仅仅是CurrentRow
),而在DataGridView中设置单元格的值并不会导致CurrentRow
更改,所以你必须自己做,设置:
CurrentCell
CurrentRow