vb.net - Keep focus on row after datagridview update -


i'm creating vb windows application. point of application simple datagridview i'm fetching view sql server database.

the datagridview refreshed every second see new data income in gridview.

the problem keeping focus on row after refresh. need solution, after click row, or cell keeps me on after refresh.

here code:

public class form1     private sub form1_load(sender object, e eventargs) handles mybase.load         'refresh every 1 sec         dim timer new timer()         timer.interval = 1000         addhandler timer.tick, addressof timer_tick         timer.start()         'todo: line of code loads data 'xyzdataset.view1' table. can move, or remove it, needed.         me.view1tableadapter.fill(me.xyzdataset.view1)     end sub      private sub datagridview1_cellcontentclick(sender object, e datagridviewcelleventargs) handles datagridview1.cellcontentclick     end sub      private sub datagridview1_cellformatting(byval sender object, byval e datagridviewcellformattingeventargs) handles datagridview1.cellformatting         integer = 0 me.datagridview1.rows.count - 1             if me.datagridview1.rows(i).cells("daytilldelivery").value <= 30                 me.datagridview1.rows(i).cells("daytilldelivery").style.forecolor = color.red             end if         next     end sub      private sub timer_tick(byval sender object, byval e eventargs)         'calling refresh after 1 second , updating data         me.datagridview1.refresh()         me.view1tableadapter.fill(me.xyzdataset.view1)     end sub end class 

i've solved similar problem in past storing indexes of selected cell in variable before doing refresh, i'm able restore selection calling datagridview.rows(selrow).cells(selcol).selected = true after update.


edit - sample code:

to later readers:
please take @ edit#2 describe better method re-select previous selected cell!

sample code:

'   variables remembering indexes of selected cell dim selrow integer dim selcol integer  '   check if there selected cell prevent nullpointerexception if datagridview1.selectedcells().count > 0     selrow = datagridview1.currentcell.rowindex     selcol = datagridview1.currentcell.columnindex end if  '   dummy "update" '   don't forget clear existing rows before adding new bunch (only if reloading rows)! datagridview1.rows.clear() index = 1 20     datagridview1.rows.add() next  '   check if there "enough" rows after update,  '   prevent setting selection rowindex greater rows.count - 1  '   cause indexoutofboundsexception if (datagridview1.rows.count - 1) > selrow     '   clear selection , reselect cell selected before index     datagridview1.clearselection()     '   next line of code, there better solution in edit #2!     datagridview1.rows(selrow).cells(selcol).selected = true        end if 

please note:

  • this procedure requires add rows in exact same order have added them before update, .index of selected row stored in variable. if readding rows in different order, not same row the row @ same position selected after refresh.
  • you should add check if there selected row @ (to prevent nullpointerexception) , if there "enough" rows in datagridview after refresh, prevent indexoutofboundsexception.
  • this works if datagridview1.selectionmode selects rows, fullrowselect.
  • don't forget clear existing rows before adding new ones updating (only if reloading rows).

edit 2 - rowheader triangle , accidental multiselect

as stated in comments below, there odd behavior lead accidental multiselect, if user holds down mouse button past refresh cycle. also, rowheader triangle not set correct row.

after research found solution behavior. instead of setting .selected-property of given cell true, set .currentcell-property of datagridview cell select!

in code, means changing

datagridview1.rows(selrow).cells(selcol).selected = true

to

datagridview1.currentcell = datagridview1.rows(selrow).cells(selcol)

and there go. :-)


Comments