开发者论坛

 找回密码
 注册 (请使用非IE浏览器)
查看: 10108|回复: 6

[源码] DevExpress的GridControl拖拽行记录排序

[复制链接]

0

精华

505

贡献

111

赞扬

正版授权组

Rank: 14Rank: 14Rank: 14Rank: 14

帖子
28
软币
429
在线时间
33 小时
注册时间
2016-9-14
发表于 2019-7-15 13:32:10 | 显示全部楼层 |阅读模式
孔子说,“人的毛病都是惯出来的”,古人说的对。

现在用户对按钮点击排序不满意了, 希望拖拽排序,,好吧,身为码农就是苦B的命。

重载GridControl控件,对MouseMove、MouseDown、MouseUp事件修改一下。

多谢涛神提供的获取行信息,据说这是内部传阅的资资料 。

效果:

录制_2019_07_15_13_00_09_905.gif

直接看代码:
[C#] 纯文本查看 复制代码
 

public class Gc11 : DevExpress.XtraGrid.GridControl
    {

        GridView gv22 = null;
        Point m_mouseDownLocation;
        int m_dragHandle;
        DragForm m_dragRowShadow;

        /// <summary>
        /// 
        /// </summary>
        /// <param name="ev"></param>
        protected override void OnMouseDown(MouseEventArgs ev)
        {
            if (ev.Button == MouseButtons.Left)
            {
                //只允许鼠标左键拖拽功能
                if (gv22 == null)
                {
                    gv22 = ((GridView)base.MainView);
                }
                //看看点击到哪个地方,如果点击了记录行,允许拖拽,只是允许,还没有开始拖拽。
                var _hit = gv22.CalcHitInfo(ev.Location);
                if (_hit.RowHandle >= 0)
                {
                    m_dragHandle = _hit.RowHandle;
                    m_mouseDownLocation = ev.Location;
                }
                else
                {
                    m_dragHandle = -1;
                }
            }

            base.OnMouseDown(ev);

        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="ev"></param>
        protected override void OnMouseMove(MouseEventArgs ev)
        {
            if (ev.Button == MouseButtons.Left && m_dragHandle >= 0)
            {
                if (m_dragRowShadow == null)
                {
                    double _x2 = Math.Pow((ev.Location.X - m_mouseDownLocation.X), 2);
                    double _y2 = Math.Pow((ev.Location.Y - m_mouseDownLocation.Y), 2);
                    double _d2 = Math.Sqrt(_x2 + _y2);
                    if (_d2 > 3)
                    {
                        //鼠标移动的距离,可以判定不是手抖,启动拖拽功能。
                        //执行拖拽;
                        this.BeginDrag(m_dragHandle);
                        //var _info = (DevExpress.XtraGrid.Views.Grid.ViewInfo.GridViewInfo)gv22.GetViewInfo();
                        //_info.GetGridRowInfo(0).CalcRectangle 
                    }
                }
                else
                {
                    m_dragRowShadow.Location = new Point(m_dragRowShadow.Location.X, this.PointToScreen(ev.Location).Y);
                }

            }
            base.OnMouseMove(ev);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="ev"></param>
        protected override void OnMouseUp(MouseEventArgs ev)
        {

            if (m_dragRowShadow != null)
            {
                var _hit = gv22.CalcHitInfo(ev.Location);
                this.EndDrag(_hit.RowHandle);
            }

            base.OnMouseUp(ev);
        }

        private void BeginDrag(int _handle)
        {
            var _info = (DevExpress.XtraGrid.Views.Grid.ViewInfo.GridViewInfo)gv22.GetViewInfo();
            //_info.GetGridRowInfo(0).CalcRectangle 

            Rectangle _bound = _info.GetGridRowInfo(_handle).Bounds;
            _bound.Location = this.PointToScreen(_bound.Location);
            m_dragRowShadow = new NetTest1.DragForm(_bound);
            m_dragRowShadow.Show();
        }

        private void EndDrag(int _handle)
        {
            if (m_dragRowShadow != null)
            {
                m_dragRowShadow.Close();
                m_dragRowShadow.Dispose();
                m_dragRowShadow = null;

                int _rowIndex = gv22.GetDataSourceRowIndex(m_dragHandle);

                DataRow _row = ((DataTable)this.DataSource).Rows[_rowIndex];
                object[] _values = _row.ItemArray;

                base.BeginUpdate();

                //移除目标行;
                ((DataTable)this.DataSource).Rows.RemoveAt(m_dragHandle);
                _row = ((DataTable)this.DataSource).NewRow();
                _row.ItemArray = _values;
                if (_handle >= 0)
                {
                    //插入指定位置;
                    ((DataTable)this.DataSource).Rows.InsertAt(_row, _handle);
                    gv22.FocusedRowHandle = _handle;
                }
                else
                {
                    //添加;
                    ((DataTable)this.DataSource).Rows.Add(_row);
                    gv22.FocusedRowHandle = gv22.RowCount - 1;
                }

                base.EndUpdate();



            }
        }


    }



源码下载
链接:https://pan.baidu.com/s/1GjSbGUpdL2kDxVO5FTXsow
提取码:ew3n






回复

使用道具 举报

0

精华

0

贡献

33

赞扬

帖子
34
软币
198
在线时间
12 小时
注册时间
2014-5-15
发表于 2019-10-12 21:07:58 | 显示全部楼层
留记号待学习
回复

使用道具 举报

0

精华

0

贡献

947

赞扬

帖子
88
软币
3077
在线时间
313 小时
注册时间
2017-5-17
发表于 2020-2-11 14:00:12 | 显示全部楼层
留下等待学习
回复

使用道具 举报

0

精华

23

贡献

383

赞扬

帖子
79
软币
729
在线时间
28 小时
注册时间
2021-9-14
发表于 2022-8-10 16:24:45 | 显示全部楼层
感谢楼主分享!!!
回复

使用道具 举报

0

精华

0

贡献

40

赞扬

帖子
15
软币
201
在线时间
10 小时
注册时间
2017-7-17
发表于 2024-3-1 09:30:01 | 显示全部楼层
请问下楼主,若girdControl 中 有可编辑的Column,这个拖拽还能生效吗?必须要设置 OptionsBehavior.Editable = false 吗?
回复

使用道具 举报

0

精华

0

贡献

584

赞扬

帖子
107
软币
1529
在线时间
113 小时
注册时间
2017-5-18
发表于 2024-3-1 11:03:04 | 显示全部楼层

感谢楼主分享!!!
回复

使用道具 举报

Archiver|手机版|小黑屋|开发者网 ( 苏ICP备08004430号-2 )
版权所有:南京韵文教育信息咨询有限公司

GMT+8, 2024-12-22 20:28

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表