C#中實現兩個GridControl之間的數據拖拽以及同一個GridControl中的數據行上下移動

1.兩個控件之間的拖拽

(1).拖拽發起方控件使用MouseDown事件獲取需要拖拽的數據行的索引

DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitInfo GridHitInfo_temp = null;
private void tRC01GridControl_MouseDown(object sender, MouseEventArgs e)
{
 //獲取鼠標當前所在座標點的信息(該點相對於控件的座標系)
 DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitInfo GridHitInfo = this.gridView3.CalcHitInfo(new Point(e.X, e.Y));
 //獲取鼠標當前所在座標的對應的數據行索引
 int MouseRowHandle = GridHitInfo.RowHandle;
 //如果索引大於0同時鼠標點擊的是左鍵
 if (MouseRowHandle >= 0 && e.Button == MouseButtons.Left)
 {
     GridHitInfo_temp = GridHitInfo;
 }
}

注:如果需要拖拽多行,則可以在此步獲取鼠標選中範圍時點擊的起始數據行和結束數據行的索引

(2).拖拽發起方控件使用MouseMove事件獲取需要拖拽的數據行

private void tRC01GridControl_MouseMove(object sender, MouseEventArgs e)
{
	if (GridHitInfo_temp == null) return;
      if (e.Button != MouseButtons.Left) return;
     //通過鼠標按下時獲取的數據行索引獲取數據
     DataRow data = gridView3.GetDataRow(GridHitInfo_temp.RowHandle);
     int[] rows = gridView3.GetSelectedRows();//獲取當前選中的數據行的索引
     //定義一個泛型集合存儲拖拽的數據
     List<DataRow> row = new List<DataRow>();
     for (int i = 0; i < rows.Length; i++)
         row.Add(gridView3.GetDataRow((int)rows[i]));
 
 
     //拖拽發起方控件開始執行拖拽操作,拖拽操作的類型爲Copy(複製)
     tRC01GridControl.DoDragDrop(row, DragDropEffects.Copy);
}

注:如果是拖拽多行,則使用SelectRange(int startRowHandle,int endRowHandle);其中兩個參數則使用第一步獲取到的起始與結束行索引

(3).設置目的控件的拖拽操作方式

private void tRC02GridControl_DragEnter(object sender, DragEventArgs e)
{
     //根據拖拽事件發起方所允許的拖放操作設置目的方的拖拽操作類型
      if (e.AllowedEffect==DragDropEffects.Move)
         e.Effect = DragDropEffects.Move;
      else
         e.Effect = DragDropEffects.Copy;
}

(4).拖拽完成,目的控件執行DragDrop事件

 private void tRC02GridControl_DragDrop(object sender, DragEventArgs e)
{
    GridControl grid = sender as GridControl;//將拖拽事件的觸發對象(目的方)轉爲控件
    DataTable table = grid.DataSource as DataTable;//獲取拖拽目的方的數據源
 
    //獲取拖拽的源數據(在調用DoDragDrop()方法時傳入)同時轉換爲傳入的類型
    List<DataRow> row = e.Data.GetData(typeof(List<DataRow>)) as List<DataRow>;
    if (row != null && table != null)
    {
        if (row.Count > 0)
        {
            //判斷當前拖拽操作的方式
            if (e.Effect != DragDropEffects.Move)
            {
                for (int i = 0; i < row.Count; i++)
                {
                    row[i]["Selection"] = "True";
                    table.ImportRow(row[i]);
                    row[i].Delete();  // 把原有的數據行刪除(會在數據行的父表中刪除)。
                }
            }
         }
    }
}

2.一個GridControl中的數據行上下移動

(1),(2),(3)步同上,只是調用對應的事件的控件爲當前的控件

(4).執行DragDrop事件

 private void tRC02GridControl_DragDrop(object sender, DragEventArgs e)
{
    GridControl grid = sender as GridControl;//將拖拽事件的觸發對象(目的方)轉爲控件
    //獲取目的方控件的默認GridView
    DevExpress.XtraGrid.Views.Grid.GridView gridView = grid.DefaultView as DevExpress.XtraGrid.Views.Grid.GridView;
    DataTable table = grid.DataSource as DataTable;//獲取拖拽目的方的數據源
 
    //根據鼠標在目的方的座標獲取對應的信息
    //該座標是根據鼠標相對於的屏幕的位置(Control.MousePosition)使用控件的PointToClient()方法轉換;
    //如果需要調試需要注意Control.MousePosition的座標在調試狀態下也會更改,因此調試時需要將斷點設置在Control.MousePosition
    //轉換爲Point對象之後才能保證轉換出來的鼠標相對於控件工作區域的座標正確
    DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitInfo GridHitInfo = gridView.CalcHitInfo(grid.PointToClient(Control.MousePosition));
 
    //獲取拖拽的源數據(在調用DoDragDrop()方法時傳入)同時轉換爲傳入的類型
    List<DataRow> row = e.Data.GetData(typeof(List<DataRow>)) as List<DataRow>;
    if (row != null && table != null)
    {
        if (row.Count > 0)
        {
            //判斷當前拖拽操作的方式
            if (e.Effect == DragDropEffects.Move)
            {
                for (int i = 0; i < row.Count; i++)
                {
                    if (GridHitInfo.RowHandle >= 0)
                    {
                        /根據鼠標轉換座標之後計算出來其相對目的控件的座標點所在行的索引新增一條空行
                        table.Rows.InsertAt(table.NewRow(), GridHitInfo.RowHandle);
                        //將拖拽的數據行的信息賦值到新增的空行中
                        table.Rows[GridHitInfo.RowHandle].ItemArray = row[i].ItemArray;
 
                    }
                    else
                    {
                        table.Rows.Add();
                        table.Rows[table.Rows.Count-1].ItemArray = row[i].ItemArray;
                    }
 
                    row[i].Delete();//刪除原來的數據行(該行所在父表中刪除)
                    table.AcceptChanges();//提交表所有的更改
                }
            }
        }
    }
}

注:使用Control.MousePosition獲取鼠標標相對於屏幕的座標時,在調試狀態下Control.MousePosition也會隨着鼠標的移動而改變,因此調試時爲了使鼠標的屏幕座標使用控件的PointToClient()方法轉換爲其相對於控件的座標時正確,需要注意斷點要打在轉換之後

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章