使用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中。

  

原文地址:https://www.cnblogs.com/haowuji/p/2817585.html