從 DataGridView 控制元件 託放資料 到 TreeView控制元件(二)

哈哈哈哈哈我撒發表於2010-05-26

前面已經實現了從 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秒就不啟動資料拖放.

 

原文地址:http://www.cnblogs.com/rick/archive/2006/07/13/draggrdtree2.html

 

相關文章