c# - Move up or down little complex DataGridView rows with multi-selection -
i have datagridview this:
now, in c# or else vb.net, button, move or down 1 position selected rows, how it?. multi selection requisite complicate me this.
the files appear in datagridview combined single executable file, then, files executed in order of "order" column, "order" value should inmutable when moving rows or down.
i'm not using data source.
i've tried analyze sample msdn, consists in extension methods, takes datatable , datasource, don't have dissapoint use datatable , datasource don't know how adapt code-sample datagridview. anyways sample not support multi selection:
move rows up/down , remember order datagridview , listboxs data bound
i have seen c# questions on stackoverflow asks single row selection:
how move gridview selected row up/down on keyup or keydown press
datagridview selected row move , down
then, don't have starting point, these methods move single row not preserve order value, if guide me extend functionality needs: private sub button_moveup_click(sender object, e eventargs) _ handles button_moveup.click
me.moveupselectedrows(me.datagridview_files) end sub private sub button_movedown_click(sender object, e eventargs) _ handles button_movedown.click me.movedownselectedrows(me.datagridview_files) end sub private sub moveupselectedrows(byval dgv datagridview) dim currowindex integer = dgv.currentcell.rowindex dim newrowindex integer = currowindex - 1 dim curcolindex integer = dgv.currentcell.columnindex dim currow datagridviewrow = dgv.currentrow if (dgv.selectedcells.count > 0) andalso (newrowindex >= 0) dgv .rows.remove(currow) .rows.insert(newrowindex, currow) .currentcell = dgv(curcolindex, newrowindex) end end if end sub private sub movedownselectedrows(byval dgv datagridview) dim currowindex integer = dgv.currentcell.rowindex dim newrowindex integer = currowindex + 1 dim curcolindex integer = dgv.currentcell.columnindex dim currow datagridviewrow = dgv.currentrow if (dgv.selectedcells.count > 0) andalso (dgv.rows.count > newrowindex) dgv .rows.remove(currow) .rows.insert(newrowindex, currow) .currentcell = dgv(curcolindex, newrowindex) end end if end sub
update
i'm trying @plutonix approach (with little modification), problem not move selected rows direction.
steps reprduce issue:
select 2 rows (eg. row index 2 , row index 3, not row index 2 , row index 4)
try move rows direction.
how fix it?.
public enum movedirection integer = -1 down = 1 end enum private sub moverows(byval dgv datagridview, byval movedirection movedirection) dim rows datagridviewrowcollection = dgv.rows ' row index dim thisrow datagridviewrow ' put selection dim selectedrows new list(of integer) ' max rows dim lastrowindex integer = if(dgv.allowusertoaddrows, rows.count - 2, rows.count - 1) n integer = lastrowindex 0 step -1 if not rows(n).isnewrow if rows(n).selected selectedrows.add(n) msgbox(n) select case movedirection case main.movedirection.down if ((n + movedirection) <= lastrowindex) andalso (n + movedirection >= 0) andalso rows(n + movedirection).selected = false selectedrows(selectedrows.count - 1) = (n + movedirection) thisrow = rows(n) rows.remove(thisrow) rows.insert(n + movedirection, thisrow) end if case main.movedirection.up if ((n + movedirection) <= lastrowindex) msgbox(selectedrows(selectedrows.count - 1)) selectedrows(selectedrows.count - 1) = (n + movedirection) thisrow = rows(n) rows.remove(thisrow) rows.insert(n + movedirection, thisrow) end if end select end if end if next n ' reselect original selected rows n integer = 0 lastrowindex dgv.rows(n).selected = selectedrows.contains(n) ' renumber order (optional & unknown, trivial) dgv.rows(n).cells(0).value = (n + 1) next n end sub
(updated)
need iterate rows collection, test if each selected, swap rows. in order keep 2 selected rows swapping each other when top or bottom, separate , down method needed.
' list of hash codes of selected rows private function getselectedrows() list(of integer) dim selr new list(of integer) ' have clear selected next row ' doesnt cause odd behavior n integer = 0 dgv.rows.count - 1 if dgv.rows(n).isnewrow = false andalso dgv.rows(n).selected selr.add(dgv.rows(n).gethashcode) dgv.rows(n).selected = false end if next return selr end function ' restore original selected rows private sub setselectedrows(selrows list(of integer)) n integer = 0 dgv.rows.count - 1 if dgv.rows(n).isnewrow = false dgv.rows(n).selected = selrows.contains(dgv.rows(n).gethashcode) ' reset order col: dgv.rows(n).cells(0).value = n + 1 end if next end sub private sub moverowsup() ' short ref dim rows datagridviewrowcollection = dgv.rows ' row index dim thisrow datagridviewrow ' put selection dim selectedrows list(of integer) ' max rows dim lastrow = if(dgv.allowusertoaddrows, rows.count - 2, rows.count - 1) selectedrows = getselectedrows() n int32 = 0 lastrow if rows(n).isnewrow = false if (selectedrows.contains(rows(n).gethashcode)) andalso (n - 1 >= 0) andalso (selectedrows.contains(rows(n - 1).gethashcode) = false) thisrow = rows(n) rows.remove(thisrow) rows.insert(n - 1, thisrow) end if end if next setselectedrows(selectedrows) end sub private sub moverowsdn() dim rows datagridviewrowcollection = dgv.rows dim thisrow datagridviewrow dim selectedrows new list(of integer) dim lastrow = if(dgv.allowusertoaddrows, rows.count - 2, rows.count - 1) selectedrows = getselectedrows() n int32 = lastrow 0 step -1 if rows(n).isnewrow = false if (selectedrows.contains(rows(n).gethashcode)) andalso (n + 1 <= lastrow) andalso (selectedrows.contains(rows(n + 1).gethashcode) = false) thisrow = rows(n) rows.remove(thisrow) rows.insert(n + 1, thisrow) end if end if next setselectedrows(selectedrows) end sub
usage:
moverowsup() ' move down: moverowsdn()
moving rows causes dgv reset selections. methods first go thru , list of hashcodes of selected rows, @ end resets each row.selected
property based on that.
the code changes value of cell(0) order , order column match (which means order column value is mutable).
moving checks see both if row @ end or if row @ destination selected. prevents rows swapping places when top or bottom.
before:
after:
note when "zalgo" got bottom (meaning 3 , 5 selected), other 1 still move down one, did while "ziggy" stayed put. ability of "ziggy(3)" move down or not based on next row/index (only) - next row not beyond bottom and not selected can still move down 1, while "zalgo (5)" not.
Comments
Post a Comment