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,
.indexof 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 indatagridviewafter refresh, preventindexoutofboundsexception. - this works if
datagridview1.selectionmodeselects 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
Post a Comment