天天看點

從 DataGridView 控件 托放資料 到 TreeView控件(二)

前面已經實作了從 DataGridView 拖放資料到 TreeView.

不過拖放是通過 滑鼠右鍵完成的. 根據windows的一般标準,是通過滑鼠左鍵來進行資料拖放操作的.

像windows資料總管,既能處理滑鼠左鍵單機的選擇,也能處理左鍵拖放操作.

這個怎麼實作?

前面我們隻處理了 DataGridView 的mousedown事件, 現在要處理 mousedown, mousemove, mouseup這三個事件來完成這個任務.

大緻過程如下:

在MouseDown事件裡面和之前一樣處理,隻是不啟動拖放操作.

而是儲存要拖放的資料, 以及建立一個小的矩形框(根據系統DragSize資訊).

然後在 MouseMove 事件裡面判斷

是否已經準備好拖放了,如果準備好了,就啟動拖放操作.

(注:滑鼠在小矩形框範圍内的移動不啟動拖放操作)

MouseUp裡面清除哪些标記量.

這樣就能處理左鍵單擊的選擇和 左鍵拖放了.

代碼如下:

從 DataGridView 控件 托放資料 到 TreeView控件(二)

private void dataGridView1_MouseDown(object sender, MouseEventArgs e)

從 DataGridView 控件 托放資料 到 TreeView控件(二)
從 DataGridView 控件 托放資料 到 TreeView控件(二)
從 DataGridView 控件 托放資料 到 TreeView控件(二)

{

從 DataGridView 控件 托放資料 到 TreeView控件(二)

            if ((e.Button & MouseButtons.Left) == MouseButtons.Left)

從 DataGridView 控件 托放資料 到 TreeView控件(二)
從 DataGridView 控件 托放資料 到 TreeView控件(二)
從 DataGridView 控件 托放資料 到 TreeView控件(二)
從 DataGridView 控件 托放資料 到 TreeView控件(二)

                DataGridView.HitTestInfo info = dataGridView1.HitTest(e.X, e.Y);

從 DataGridView 控件 托放資料 到 TreeView控件(二)
從 DataGridView 控件 托放資料 到 TreeView控件(二)

                if (info.RowIndex >= 0)

從 DataGridView 控件 托放資料 到 TreeView控件(二)
從 DataGridView 控件 托放資料 到 TreeView控件(二)
從 DataGridView 控件 托放資料 到 TreeView控件(二)
從 DataGridView 控件 托放資料 到 TreeView控件(二)

                    dragData = (DataGridViewRow)

從 DataGridView 控件 托放資料 到 TreeView控件(二)

                          dataGridView1.Rows[info.RowIndex];

從 DataGridView 控件 托放資料 到 TreeView控件(二)
從 DataGridView 控件 托放資料 到 TreeView控件(二)

                    Size dragSize = SystemInformation.DragSize;

從 DataGridView 控件 托放資料 到 TreeView控件(二)

                    dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width / 2),

從 DataGridView 控件 托放資料 到 TreeView控件(二)

                                                                e.Y - (dragSize.Height / 2)), dragSize);

從 DataGridView 控件 托放資料 到 TreeView控件(二)
從 DataGridView 控件 托放資料 到 TreeView控件(二)

                }

從 DataGridView 控件 托放資料 到 TreeView控件(二)

            }

從 DataGridView 控件 托放資料 到 TreeView控件(二)
從 DataGridView 控件 托放資料 到 TreeView控件(二)

        }

從 DataGridView 控件 托放資料 到 TreeView控件(二)
從 DataGridView 控件 托放資料 到 TreeView控件(二)

        private void dataGridView1_MouseUp(object sender, MouseEventArgs e)

從 DataGridView 控件 托放資料 到 TreeView控件(二)
從 DataGridView 控件 托放資料 到 TreeView控件(二)
從 DataGridView 控件 托放資料 到 TreeView控件(二)
從 DataGridView 控件 托放資料 到 TreeView控件(二)

            //reset

從 DataGridView 控件 托放資料 到 TreeView控件(二)

            dragBoxFromMouseDown = Rectangle.Empty;

從 DataGridView 控件 托放資料 到 TreeView控件(二)

            dragData = null;

從 DataGridView 控件 托放資料 到 TreeView控件(二)
從 DataGridView 控件 托放資料 到 TreeView控件(二)
從 DataGridView 控件 托放資料 到 TreeView控件(二)

        private void dataGridView1_MouseMove(object sender, MouseEventArgs e)

從 DataGridView 控件 托放資料 到 TreeView控件(二)
從 DataGridView 控件 托放資料 到 TreeView控件(二)
從 DataGridView 控件 托放資料 到 TreeView控件(二)
從 DataGridView 控件 托放資料 到 TreeView控件(二)

            if ((e.Button & MouseButtons.Left) == MouseButtons.Left &&

從 DataGridView 控件 托放資料 到 TreeView控件(二)

                dragData != null &&

從 DataGridView 控件 托放資料 到 TreeView控件(二)

                dragBoxFromMouseDown != Rectangle.Empty && 

從 DataGridView 控件 托放資料 到 TreeView控件(二)

                    !dragBoxFromMouseDown.Contains(e.X, e.Y)

從 DataGridView 控件 托放資料 到 TreeView控件(二)

                )

從 DataGridView 控件 托放資料 到 TreeView控件(二)
從 DataGridView 控件 托放資料 到 TreeView控件(二)
從 DataGridView 控件 托放資料 到 TreeView控件(二)
從 DataGridView 控件 托放資料 到 TreeView控件(二)

                //開始拖放;

從 DataGridView 控件 托放資料 到 TreeView控件(二)

                dataGridView1.DoDragDrop(dragData, DragDropEffects.Copy);

從 DataGridView 控件 托放資料 到 TreeView控件(二)
從 DataGridView 控件 托放資料 到 TreeView控件(二)

最後使用中又發現一個問題.

就是不能用滑鼠左鍵圈選單元格了.

這個該怎麼處理呢? 這兩個操作是有沖突的.

這裡我們可以通過時間來控制. 即我們要求按下滑鼠左鍵, 0.5秒之後 拖動滑鼠 就啟動資料拖放.

否則就按預設的圈選單元格.

即增加一個變量,在 MouseDown裡面記錄時間,在 MouseMove裡面判斷時間差.

如果不夠 0.5秒就不啟動資料拖放.

繼續閱讀