【发布时间】: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