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>();



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM