滚轮翻页与传动的翻页更为方便,经过本人一番探讨与琢磨终于在xtragrid的gridview中实现了鼠标滚轮翻页。
我新建了一个组件继承原本的gridcontrol,在组件中添加了一个imagelist,专门存放一些资源图片。用于实现动态图的效果。
添加一个自定义委托的参数与枚举,委托参数用于传递分页的信息。
public class pagingeventargs : eventargs { public int pagesize { get; set; } public int pageindex { get; set; } } public enum loadstate { /// <summary> /// 就绪 /// </summary> ready, /// <summary> /// 正在读取 /// </summary> loading, /// <summary> /// 读取完成 /// </summary> finish }
在组件的类里面添加以下字段
/// <summary> /// 页面大小 /// </summary> private int _int_page_size=20; /// <summary> /// 当前页索引 /// </summary> private int _int_page_index=1; /// <summary> /// 总记录数 /// </summary> private int _int_record_count; /// <summary> /// 读取状态 /// </summary> private loadstate _lodastate_state;
添加以下属性
(!ispaging) (!ispaging) = (value>,
else
{
while (this.mainview.datarowcount > 0)
gridview_main_view.deleterow(0);
this.refreshdatasource();
}
} } /// <summary> /// 每次读取的行数 /// </summary> public int pagesize { get { if (!ispaging) return 0; return _int_page_size; } set { if (!ispaging) return ; _int_page_size = value; } } /// <summary> /// 总页数 /// </summary> private int pagecount { get { if (recordcount % pagesize == 0) return recordcount / pagesize; return recordcount / pagesize + 1; } } /// <summary> /// grid /// </summary> private gridview _gridview_main_view { get { return (gridview)this.mainview; } } /// <summary> /// 是否启用分页 /// </summary> public bool ispaging { get; set; }
添加以下委托与事件
/// <summary> /// 内部使用的委托 /// </summary> private delegate void mydelegate(); /// <summary> /// 滚动翻页的委托 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public delegate void scrollingtopageeventhandler(object sender, pagingeventargs e); /// <summary> /// 滚动翻页的事件 /// </summary> public event scrollingtopageeventhandler onscrollingtopage;
以下则是一些对控件的设置,按照各人喜好可以有所更改。
/// <summary> /// 设置分页栏 /// </summary> private void initembeddednavigator() {this.embeddednavigator.custombuttons.addrange(new devexpress.xtraeditors.navigatorcustombutton[] { new devexpress.xtraeditors.navigatorcustombutton(-1, -1, true, false, , null)}); this.embeddednavigator.textstringformat = 当前 {1} 行数据 ; this.useembeddednavigator = true; } /// <summary> /// 设置gridview /// </summary> private void initgridview() { _gridview_main_view.toprowchanged += new eventhandler(gridview_toprowchanged); }
为控件的事件注册以下方法
private void gridcontrol_load(object sender, eventargs e) { if (ispaging) { _lodastate_state = loadstate.ready; initembeddednavigator(); initgridview(); } } private void gridview_toprowchanged(object sender, eventargs e) { lock (this) { if ( _int_page_index > pagecount || _lodastate_state != loadstate.ready) return; } //检查是否到达底部 if (_gridview_main_view.isrowvisible(_gridview_main_view.rowcount - 1) == rowvisiblestate.visible|| _int_page_index==1) { lock (this)//设置成开始读取状态 { _lodastate_state = loadstate.loading; } thread thread_load_data = new thread(new threadstart(loaddata)); thread thread_change_text = new thread(new threadstart(changeloadingimage)); thread_change_text.start(); thread_load_data.start(); } }
toprowchanged事件在grid的首行改变了就会触发,类似于滚动条的scroll事件。这里开了两个线程,第一个线程用于读取数据,第二个线程用于实现动态图。两个线程调用的方法都在下面
top_row_index = focus_index = (== (onscrollingtopage == exception(= = = (.parent.invoke( mydelegate(== (= loadstate.finish; p_w_picpath_index = (.parent.invokerequired).parent.invoke( mydelegate(.embeddednavigator.buttons.custombuttons[].visible = () ( (_lodastate_state != loadstate.loading) (p_w_picpath_index == = ++ ( .parent.invoke( mydelegate(.embeddednavigator.buttons.custombuttons[].imageindex = (.parent.invokerequired).parent.invoke( mydelegate(.embeddednavigator.buttons.custombuttons[].visible = (= ++
不过这个代码有点问题,当gridcontrol绑定的数据源有相同实例的子项时,随着refreshdata方法的调用会不停触发toprowchanged事件,确切的原因还没搞清楚,解决这个问题就是要不去除数据源上相同的实例子项,要不就不调用refreshdata方法。
以上就是如何进行xtragrid滚轮翻页的详细内容。