• devpress 的gridview 控件的行拖拽 z


    首先,添加引用:using DevExpress.XtraGrid.Views.Grid.ViewInfo; 
     
               gridControl1.AllowDrop = true; // 确保能够拖拽
                  gridView1.OptionsSelection.MultiSelect = true;     //确保能够多选
                gridView1.OptionsSelection.EnableAppearanceFocusedCell = false; //确保选定行的背景色一样。
                gridView1.OptionsBehavior.Editable = false;  
                gridView1.OptionsBehavior.ReadOnly = true;
               上述初始化最好放在赋数据源之前。否则数据一开始显示的时候没有选中行。

            //GridHitInfo根据鼠标点击的x、y坐标获取该点的相关信息
            private GridHitInfo downHitInfo;  
            private GridHitInfo upHitInfo;
    触发事件:
     
            //鼠标按下事件
            private void gridView1_MouseDown(object sender, MouseEventArgs e)
            {
                downHitInfo = gridView1.CalcHitInfo(new Point(e.X,e.Y));
            }

           //鼠标移动事件
            private void gridView1_MouseMove(object sender, MouseEventArgs e)        {
                if (e.Button != MouseButtons.Left) return;        //判断是否是左键
                if (downHitInfo == null||downHitInfo.RowHandle <0) return;   //判断按下的位置是否有值,是否是gridview 的Items.

                 int[] rows =gridView1.GetSelectedRows();
                 List<XESHI > row = new List<XESHI >();

                 foreach (int r in rows)   // 获取gridview 数据源中对应的信息。
                 {
                     //根据 gridview 中的行索引获取数据源中对应的是行索引
                     int dataSourcerows = gridView1.GetDataSourceRowIndex(r);

                     row.Add(asd[dataSourcerows]);
                 }
                 gridControl1.DoDragDrop(row, DragDropEffects.Move);//开始拖放操作。
            }

            private void gridControl1_DragDrop(object sender, DragEventArgs e)
            {
                //获取鼠标在屏幕上的位置。
                Point gridviewPoint = this.PointToScreen (this.gridControl1.Location  );  
                //获取 gridview 中对应的的位置(屏幕位置减去 gridView 开始位置)
                upHitInfo = gridView1.CalcHitInfo(new Point(e.X - gridviewPoint.X, e.Y - gridviewPoint.Y));  
                  if (upHitInfo == null || upHitInfo.RowHandle < 0) return;
                //获取释放的位置列索引
                int endRow =gridView1.GetDataSourceRowIndex ( gridView1.GetDataSourceRowIndex(upHitInfo.RowHandle));   
               
                List<XESHI> row = e.Data.GetData(typeof(List<XESHI>)) as List<XESHI>;  //获取要移动的数据

                if (row != null && row.Count > 0) //没有移动的数据跳过
                {
                    int a;
                    //获取移动列集合的第一列在数据源的索引
                    int startRow = asd.IndexOf(row[0]); 

                    XESHI xs = asd[endRow];

                    if (!row.Contains(xs))  //如果多选的话,确保不能拖拽到这几个里
                    {
                        gridView1.ClearSelection();
                        //排序,先删除后后添加,
                        for (int i = 0; i < row.Count; i++)
                            asd.Remove(row[i]);
                        //若果往上托,则加在鼠标到达行的上面
                        //如果往下拖,则加在鼠标到达行的下面
                        if (startRow > endRow)
                            a = asd.IndexOf(xs);
                        else
                            a = asd.IndexOf(xs) + 1;

                        for (int i = 0; i < row.Count; i++)
                        {
                            asd.Insert(a + i, row[i]);
                            gridView1.SelectRow(a + i);
                        }
                        gridView1.FocusedRowHandle = a;
                    }

                }
                gridControl1.DataSource = asd;
                gridView1.RefreshData();
            }
     
     
            private void gridControl1_DragEnter(object sender, DragEventArgs e)
            {
                e.Effect = DragDropEffects.Move;
            }
     
     
     
     
    程序中用到的一些类:

     public class XESHI
        {
            public string Name { getset; }
            public string Xinshui { getset; }
        }

     List<XESHI> asd = new List<XESHI>();


  • 相关阅读:
    PHP 将二维数组中某列值作为数组的键名
    MySQL 8下忘密码后重置密码
    单一职责原则
    Linux下安装SVN服务端小白教程
    go 代码玩耍
    centos7 docker开启认证的远程端口2376配置教程
    Dockerfile RUN,CMD,ENTRYPOINT命令区别
    wait-for-it.sh脚本控制docker-compose启动顺序详解
    阿里云服务器漏洞修复_2020.5.22
    Let's Encrypt 免费通配符 SSL 证书申请教程
  • 原文地址:https://www.cnblogs.com/zeroone/p/4176887.html
Copyright © 2020-2023  润新知