使用DevExpress.XtraGrid.Views.Grid.GridView 点击表头排序时焦点固定到所选中行的行号,而不是固定到这条数据
最近客户反应点击表头排序的时候。比如排序前选中的是第一行,那么排序后也选中的是第一行。而不是焦点行随着数据走。
开始以为DevExpress.XtraGrid.Views.Grid.GridView这个里面应该有设置这个的属性,但是找了好久就是没有找到。最后只能给DevExpress.XtraGrid.Views.Grid.GridView写了两个事件。
1.先建立一个页面名称叫做:frmPublic,这个页面里面有一个静态的属性是
/// <summary> /// 设置排序时的行号 /// </summary> private static int StartSort = -1;
2.给这个页面添加第一个静态方法:gridView_StartSorting(排序前)
排序前的方法
#region 排序前+public static void gridView_StartSorting(object sender, EventArgs e) /// <summary> /// 排序前 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public static void gridView_StartSorting(object sender, EventArgs e) { StartSort = -1; if (((DevExpress.XtraGrid.Views.Grid.GridView)sender).GetSelectedRows().Length > 0) { StartSort = ((DevExpress.XtraGrid.Views.Grid.GridView)sender).GetSelectedRows()[0]; } } #endregion
3.给这个页面添加第二个静态方法:gridView_EndSorting(排序后)
排序后的方法
#region 排序后+public static void gridView_EndSorting(object sender, EventArgs e) /// <summary> /// 排序后 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public static void gridView_EndSorting(object sender, EventArgs e) { if (StartSort > -1) { for (int i = 0; i < ((DevExpress.XtraGrid.Views.Grid.GridView)sender).RowCount; i++) { ((DevExpress.XtraGrid.Views.Grid.GridView)sender).UnselectRow(i); } ((DevExpress.XtraGrid.Views.Grid.GridView)sender).FocusedRowHandle = StartSort; ((DevExpress.XtraGrid.Views.Grid.GridView)sender).SelectRow(StartSort); } } #endregion
然后这个页面就告一段落了。
最后给需要排序的页面的DevExpress.XtraGrid.Views.Grid.GridView绑定事件,代码如下:
绑定事件
// gvCmCode.EndSorting += new EventHandler(frmPublic.gridView_EndSorting); gvCmCode.StartSorting += new EventHandler(frmPublic.gridView_StartSorting);
然后运行就ok了。
结论:这个的原理是,点击排序前是先把焦点行号记住在一个静态变量中。然后点击排序后再让表格的焦点成为这个行号。
注意这个目前适用于:窗体的页面。在web的页面就不好使了,如果是web的页面可以把那个行号放在cookie中。