在数据表数据源中上下移动数据网格视图而不更新视图

问题描述 投票:0回答:1

我看了网上,然后看到很多类似的文章。我的代码正确地移动了行。这是发生了什么。我运行该程序,然后按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]
vb.net datagridview dataview
1个回答
0
投票

由于您已经对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    
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.