c# - Move up or down little complex DataGridView rows with multi-selection -


i have datagridview this:

enter image description here

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:

  1. select 2 rows (eg. row index 2 , row index 3, not row index 2 , row index 4)

  2. 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:
enter image description here

after:
enter image description here

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

Popular posts from this blog

c# - Validate object ID from GET to POST -

node.js - Custom Model Validator SailsJS -

php - Find a regex to take part of Email -