前面已經實作了從 DataGridView 拖放資料到 TreeView.
不過拖放是通過 滑鼠右鍵完成的. 根據windows的一般标準,是通過滑鼠左鍵來進行資料拖放操作的.
像windows資料總管,既能處理滑鼠左鍵單機的選擇,也能處理左鍵拖放操作.
這個怎麼實作?
前面我們隻處理了 DataGridView 的mousedown事件, 現在要處理 mousedown, mousemove, mouseup這三個事件來完成這個任務.
大緻過程如下:
在MouseDown事件裡面和之前一樣處理,隻是不啟動拖放操作.
而是儲存要拖放的資料, 以及建立一個小的矩形框(根據系統DragSize資訊).
然後在 MouseMove 事件裡面判斷
是否已經準備好拖放了,如果準備好了,就啟動拖放操作.
(注:滑鼠在小矩形框範圍内的移動不啟動拖放操作)
MouseUp裡面清除哪些标記量.
這樣就能處理左鍵單擊的選擇和 左鍵拖放了.
代碼如下:
private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
{
if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
DataGridView.HitTestInfo info = dataGridView1.HitTest(e.X, e.Y);
if (info.RowIndex >= 0)
dragData = (DataGridViewRow)
dataGridView1.Rows[info.RowIndex];
Size dragSize = SystemInformation.DragSize;
dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width / 2),
e.Y - (dragSize.Height / 2)), dragSize);
}
}
}
private void dataGridView1_MouseUp(object sender, MouseEventArgs e)
//reset
dragBoxFromMouseDown = Rectangle.Empty;
dragData = null;
private void dataGridView1_MouseMove(object sender, MouseEventArgs e)
if ((e.Button & MouseButtons.Left) == MouseButtons.Left &&
dragData != null &&
dragBoxFromMouseDown != Rectangle.Empty &&
!dragBoxFromMouseDown.Contains(e.X, e.Y)
)
//開始拖放;
dataGridView1.DoDragDrop(dragData, DragDropEffects.Copy);
最後使用中又發現一個問題.
就是不能用滑鼠左鍵圈選單元格了.
這個該怎麼處理呢? 這兩個操作是有沖突的.
這裡我們可以通過時間來控制. 即我們要求按下滑鼠左鍵, 0.5秒之後 拖動滑鼠 就啟動資料拖放.
否則就按預設的圈選單元格.
即增加一個變量,在 MouseDown裡面記錄時間,在 MouseMove裡面判斷時間差.
如果不夠 0.5秒就不啟動資料拖放.