從 DataGridView 控制元件 託放資料 到 TreeView控制元件(二)
前面已經實現了從 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);
}
}
{
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秒就不啟動資料拖放.
原文地址:http://www.cnblogs.com/rick/archive/2006/07/13/draggrdtree2.html
相關文章
- 從 DataGridView 控制元件 託放資料 到 TreeView控制元件View控制元件
- 控制元件treeview的使用 (轉)控制元件View
- ACCESS TreeView控制元件的使用View控制元件
- DataGridView控制元件用法合集View控制元件
- jQuery 樹形控制元件 TreeView 的 BugjQuery控制元件View
- c#之datagridview控制元件_用於從資料庫重新載入資料和向資料庫提交更改C#View控制元件資料庫
- DataGridView控制元件 1129View控制元件
- 從零開始使用JavaScript編寫資料表格控制元件(二)JavaScript控制元件
- 【轉載】WPF中TreeView控制元件資料繫結和後臺動態新增資料(一)View控制元件
- 將treeview控制元件內容匯出圖片View控制元件
- 【孟憲會】TreeView 控制元件之不回發操作View控制元件
- c#之datagridview控制元件(1)_小記C#View控制元件
- 最近我在用treeview+自定義SiteMapDataSource控制元件讀取資料庫資料做導航列。View控制元件資料庫
- 效能調優的Windows窗體DataGridView控制元件WindowsView控制元件
- 給pb的listview或者treeview控制元件加上背景圖 (轉)View控制元件
- winform中可以摺疊的datagridview,自定義控制元件ORMView控制元件
- 遮蔽DataGridView控制元件DataError 事件提示的異常資訊View控制元件Error事件
- 巧用DataGridView控制元件構建快速輸入體驗View控制元件
- FQ:從入門到放棄(二)
- 從連線到資料(二)
- Flutter 自定義縮放控制元件Flutter控制元件
- hive從入門到放棄(二)——DDL資料定義Hive
- Realm資料庫 從入門到“放棄”資料庫
- 從入門到放棄之大資料Hive大資料Hive
- Realm 資料庫 從入門到“放棄”資料庫
- WPF中TreeView控制元件如何獲取選中的TreeViewItem物件?View控制元件物件
- Angular 從入坑到挖坑 - 表單控制元件概覽Angular控制元件
- Winform控制元件繫結資料ORM控制元件
- PB下使用TreeView控制元件實現多級分類檢索View控制元件
- 從零開始使用JavaScript編寫資料表格控制元件(一)JavaScript控制元件
- AOP埋點從入門到放棄(二)
- Winform開發--資料從一個DataGridView轉移到另一個DataGridViewORMView
- hive從入門到放棄(三)——DML資料操作Hive
- 動態綁資料(Repeater控制元件控制元件
- [工作札記]02: .Net Winform控制元件TreeView最簡遞迴繫結方法ORM控制元件View遞迴
- 如何:使用TreeView控制元件實現樹結構顯示及快速查詢View控制元件
- 自定義控制元件(二) 從原始碼分析事件分發機制控制元件原始碼事件
- 使用委託及控制元件的invoke方法處理窗體控制元件的跨執行緒訪問控制元件執行緒