c# - DataGrid auto scrolling when doing selection -
c# - DataGrid auto scrolling when doing selection -
i have custom datagrid, in datagrid alter way select element. have feature added selection, :
when select element, it's "ctrl" key press. when click on selected row, row become unselected. when multiple selection, row alter selectedvalue 1 first row going have. when multiple selection (mouse down, move, mouse up) right click it's reversing selected value of rows.it's datagrid extension, coding in c#.
for doing added event handle on previewmousedown , mouseup of datagridrow.
private enum buttonclicked {left, middle, right}; private buttonclicked m_omousebuttonclicked; private void previewmousedownhandler(object sender, mousebuttoneventargs e) { datagridrow row = sender datagridrow; if (e.leftbutton == mousebuttonstate.pressed) { row.isselected = !row.isselected; m_omousebuttonclicked = buttonclicked.left; } else if (e.rightbutton == mousebuttonstate.pressed) { //row.isselected = !row.isselected; m_omousebuttonclicked = buttonclicked.right; } row.capturemouse(); row.mousemove += row_mousemove; e.handled = true; } void row_mousemove(object sender, mouseeventargs e) { point oposfromthis = e.getposition(this); if (oposfromthis.y > this.actualheight) { } else if (oposfromthis.y < 0) { } } void row_mouseup(object sender, mousebuttoneventargs e) { int nstart; int nend; datagridrow row = sender datagridrow; row.releasemousecapture(); row.mousemove -= row_mousemove; int nstartrowindex = itemcontainergenerator.indexfromcontainer(row); point oposfromrow = e.mousedevice.getposition(row); int nendrowindex = nstartrowindex + (int)math.floor(oposfromrow.y / row.actualheight); if (nstartrowindex < nendrowindex) { nstart = math.max(nstartrowindex, 0); nend = math.min(nendrowindex, items.count - 1); } else { nstart = math.max(nendrowindex, 0); nend = math.min(nstartrowindex, items.count - 1); } (; nstart <= nend; ++nstart) { datagridrow otmp = ((datagridrow)itemcontainergenerator.containerfromindex(nstart)); if (m_omousebuttonclicked == buttonclicked.left) { otmp.isselected = row.isselected; } else if (m_omousebuttonclicked == buttonclicked.right) { otmp.isselected = !otmp.isselected; } } e.handled = true; }
i give mouse capture row clicked, able grab mouseup if go outside datagrid.
but code, lost feature have. auto scrolling when multiple selection , go under or upper datagrid. know ii have add together mousemove handler it, stuck cause don't know how it.
i found solution try-error attempts. added method scrollviewer element, starting timer execute scroll alone.
public claa aaa { private enum buttonclicked {left, middle, right}; private buttonclicked m_omousebuttonclicked; private dispatchertimer m_otimer; private double m_nscrolloffset; private scrollviewer m_oscrollbar; public icualertgrid() { this.initialized += icualertgrid_initialized; this.loaded += icualertgrid_loaded; m_otimer = new dispatchertimer(); m_otimer.tick += m_otimer_tick; m_otimer.interval = new timespan(2500000); } void icualertgrid_initialized(object sender, eventargs e) { setstyle0(true); //throw new notimplementedexception(); } void icualertgrid_loaded(object sender, routedeventargs e) { m_oscrollbar = getscrollviewer(this); } void m_otimer_tick(object sender, eventargs e) { if (m_oscrollbar != null) { m_oscrollbar.scrolltoverticaloffset(m_oscrollbar.verticaloffset + m_nscrolloffset); } } private void previewmousedownhandler(object sender, mousebuttoneventargs e) { datagridrow row = sender datagridrow; if (e.leftbutton == mousebuttonstate.pressed) { row.isselected = !row.isselected; m_omousebuttonclicked = buttonclicked.left; } else if (e.rightbutton == mousebuttonstate.pressed) { //row.isselected = !row.isselected; m_omousebuttonclicked = buttonclicked.right; } row.capturemouse(); row.mousemove += row_mousemove; e.handled = true; } private void row_mousemove(object sender, mouseeventargs e) { datagridrow orow = sender datagridrow; point oposfromthis = e.getposition(this); if (oposfromthis.y < 0) { m_nscrolloffset = -1.0; m_otimer.start(); } else if (this.actualheight < oposfromthis.y) { m_nscrolloffset = 1.0; m_otimer.start(); } else { m_otimer.stop(); } } private void row_mouseup(object sender, mousebuttoneventargs e) { int nstart; int nend; m_otimer.stop(); datagridrow row = sender datagridrow; row.releasemousecapture(); row.mousemove -= row_mousemove; int nstartrowindex = itemcontainergenerator.indexfromcontainer(row); point oposfromrow = e.mousedevice.getposition(row); int nendrowindex = nstartrowindex + (int)math.floor(oposfromrow.y / row.actualheight); if (nstartrowindex < nendrowindex) { nstart = math.max(nstartrowindex, 0); nend = math.min(nendrowindex, items.count - 1); } else { nstart = math.max(nendrowindex, 0); nend = math.min(nstartrowindex, items.count - 1); } (; nstart <= nend; ++nstart) { datagridrow otmp = ((datagridrow)itemcontainergenerator.containerfromindex(nstart)); if (m_omousebuttonclicked == buttonclicked.left) { otmp.isselected = row.isselected; } else if (m_omousebuttonclicked == buttonclicked.right) { otmp.isselected = !otmp.isselected; } } e.handled = true; } private static scrollviewer getscrollviewer(dependencyobject p_oparent) { scrollviewer kid = default(scrollviewer); int numvisuals = visualtreehelper.getchildrencount(p_oparent); (int = 0; < numvisuals; i++) { visual v = (visual)visualtreehelper.getchild(p_oparent, i); kid = v scrollviewer; if (child == null) { kid = getscrollviewer(v); } if (child != null) { break; } } homecoming child; } }
c# wpf datagrid
Comments
Post a Comment