2016-12-19 3 views
-1

Я пытаюсь создать функции для перемещения вверх или вниз по строке в 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 
+0

а), что обыкновение компиляции под Option Strict б) DataTable строк отличные от строк datagridvioew. c) если вы хотите изменить порядок «в datatable», то измените значения этой ячейки RowNum и оставьте DGV из него. – Plutonix

+0

@Plutonix a) Он компилируется в разделе Option Strict. б) Я согласен, но я не вижу никакого несоответствия. c) Это то, что я пытаюсь сделать, код DGV, который вы видите там, гарантирует только то, что правильная строка выбрана после того, как было выполнено изменение в порядке. Поскольку, когда вы перемещаете строку вверх, вы хотите, чтобы выбор был перемещен вверх по строке, т. Е. Чтобы вы могли продолжить перемещение строки дальше. –

+0

У меня есть полный рабочий пример здесь https://code.msdn.microsoft.com/Move-rows-updown-and-987fe786 –

ответ

0
  1. Добавить столбец Integer в вашей DataTable называется последовательность
  2. Установите таблицу DefaultView.Sort в последовательности
  3. Создайте DataView, который изначально сортирует ваши данные на RowNo
  4. Итерировать строки в вид присвоения последовательности грести индекс
  5. Bind вашего стола к вашему DataGridView
  6. Измените значение последовательности в строках таблицы для перемещения строк вверх/вниз
+0

Мне не удалось добиться результата даже при добавлении дополнительных определений данных DataView, однако я буду отмечать это как ответ, поскольку он более или менее привел меня к решению. И в конце концов, возможно, это была какая-то глупая ошибка, которая мешала этому точному решению работать. –