【问题标题】:VB.NET Shifting row up/down in SORTED datatableVB.NET 在 SORTED 数据表中向上/向下移动行
【发布时间】:2016-12-19 11:59:33
【问题描述】:

我正在尝试创建函数以在 datagridview 中向上或向下移动行,该数据由数据表 dtProc 提供。在未绑定的 datagridview 上会很容易,但我正在尝试使用 datasource = dtProc 来实现它。问题是,我将 dtProc 协议 排序 到 RowNo(正确的顺序)。下面的功能有效,但只有一次。第二次它移动 original 位置的行,而不是所需的行,它向上移动了 1 行。索引是正确的,但未排序的 dtRows(在其上执行操作)的顺序与显示的排序的 dtRows 不同。

Private Sub ShiftUp()
    If Me.dgwNew.SelectedRows.Count > 0 Then            ' if selection exists
        Dim selIdx As Int16 = Me.dgwNew.SelectedRows(0).Index      ' selected index
        Dim secIdx As Int16 = Me.dgwNew.SelectedRows(0).Index - 1  ' second index
        MsgBox("selIdx=" & selIdx & "     secIdx=" & secIdx)       ' test feedback
        dtProc.DefaultView.Sort = ("RowNo ASC")         ' trying to keep sorted order
        dtProc.Rows(selIdx)("RowNo") = secIdx + 1       ' swap selected index with second
        dtProc.Rows(secIdx)("RowNo") = selIdx + 1       ' swap second index with selected
        Call RefreshDgw()
        Me.dgwNew.ClearSelection()                      ' clear datagridview selection
        Me.dgwNew.CurrentCell = Me.dgwNew.Rows(secIdx).Cells(0)
        Me.dgwNew.Rows(secIdx).Selected = True          ' set selection on secondary row
    End If
End Sub

Private Sub RefreshDgw()
    dtProc.DefaultView.Sort = ("RowNo ASC")
    Me.dgwNew.DataSource = dtProc.DefaultView.ToTable
End Sub

有什么技巧可以让它发挥作用吗?

编辑 - 最终解决方案:

我也无法使用 DataView,问题仍然存在。所以我不得不添加一个额外的函数,它根据DataView中的行索引获取DataTable中的行索引。

Private Function GetDataTableRowID(rowIdx)
    Dim RetVal As Int16
    For ir = 0 To dtProc.Rows.Count - 1 
        If rowIdx + 1 = dtProc.Rows(ir)("RowNo") Then
            RetVal = ir
            Exit For
        End If
    Next
    Return RetVal
End Function

然后我修改了这两行,其中我设置索引如下:

        Dim selIdx As Int16 = Me.dgwNew.SelectedRows(0).Index      ' selected DataView index
        Dim secIdx As Int16 = Me.dgwNew.SelectedRows(0).Index - 1  ' second DataView index

        Dim selIdx2 As Int16 = GetDataTableRowID(selIdx)      ' selected DataTable index
        Dim secIdx2 As Int16 = GetDataTableRowID(secIdx)      ' second DataTable index

        dtProc.Rows(selIdx2)("RowNo") = secIdx + 1       ' swap selected index with second
        dtProc.Rows(secIdx2)("RowNo") = selIdx + 1       ' swap second index with selected

【问题讨论】:

  • a) 不会在 Option Strict 下编译 b) 数据表行与 datagridvioew 行不同 c) 如果您想更改“在数据表中”的顺序,则更改该 RowNum 单元格的值并保留DGV 出来了。
  • @Plutonix a) 它确实在 Option Strict 下编译。 b) 我同意,但我没有看到任何不匹配 c) 这就是我想要做的,您在那里看到的 DGV 代码只能确保在执行更改顺序后选择正确的行。因为当您向上移动一行时,您希望选择与该行一起向上移动,即您可以继续将该行进一步向上移动。
  • 我在这里有一个完整的工作示例code.msdn.microsoft.com/Move-rows-updown-and-987fe786
  • 非常感谢凯伦,我会记住您的评论,下次实现此功能时会查看您的代码和文章。

标签: vb.net sorting datagridview datatable


【解决方案1】:
  1. 在 DataTable 中添加一个名为 Sequence 的 Integer 列
  2. 将表 DefaultView.Sort 设置为 Sequence
  3. 创建一个 DataView,最初对 RowNo 上的数据进行排序
  4. 迭代视图中的行,将序列分配给行索引
  5. 将表格绑定到 DataGridView
  6. 更改表格行中的序列值以向上/向下移动行

【讨论】:

  • 即使使用额外的排序广告 DataView 定义,我也无法获得结果,但是我会将其标记为答案,因为它或多或少地引导我找到解决方案。毕竟,这可能是我的一些愚蠢的错误,导致这个确切的解决方案无法奏效。
猜你喜欢
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多