Я пытаюсь создать функции для перемещения вверх или вниз по строке в datagridview, которая подается из datPable datatable. Это было бы легко для несвязанного datagridview, но я пытаюсь достичь его с помощью datasource = dtProc. Проблема в том, что I сортировать dtProc accordint для RowNo (правильный порядок). Функция ниже работает, но только ONCE. Второй раз он сдвигает строки в позиции , а не на нужные строки, которые перемещаются на 1 строку. Индексы верны, но несортированные dtRows (на которых выполняется операция) имеют другой порядок отображения, отсортированный dtRows.VB.NET Сдвиг строки вверх/вниз в SORTED datatable
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
Есть ли уловка, чтобы заставить ее работать?
EDIT - ЗАВЕРШЕНИЕ РЕШЕНИЕ:
Я не мог работать с DataView либо, проблема сохраняется. Поэтому мне пришлось добавить дополнительную функцию, которая получает индекс строки в DataTable в соответствии с индексом строки в DataView.
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
а), что обыкновение компиляции под Option Strict б) DataTable строк отличные от строк datagridvioew. c) если вы хотите изменить порядок «в datatable», то измените значения этой ячейки RowNum и оставьте DGV из него. – Plutonix
@Plutonix a) Он компилируется в разделе Option Strict. б) Я согласен, но я не вижу никакого несоответствия. c) Это то, что я пытаюсь сделать, код DGV, который вы видите там, гарантирует только то, что правильная строка выбрана после того, как было выполнено изменение в порядке. Поскольку, когда вы перемещаете строку вверх, вы хотите, чтобы выбор был перемещен вверх по строке, т. Е. Чтобы вы могли продолжить перемещение строки дальше. –
У меня есть полный рабочий пример здесь https://code.msdn.microsoft.com/Move-rows-updown-and-987fe786 –