2012-04-29 41 views
1

我有兩個listview [listView1,listLocal],他們是本地PC和遠程PC的兩個文件瀏覽器。如果我將項目拖放到同一個列表視圖中,我應該複製/移動。 否則,如果我將物品放入其他列表視圖,則應發送/接收。ListView拖放,如何檢查是否將該項目放在同一列表視圖中?

所以讓listLocal是本地PC的文件瀏覽器,listView1是遠程PC。
所以我需要的是一個條件,檢查是否將拖動的項目拖放到其他列表視圖中。

private void listLocal_ItemDrag(object sender, ItemDragEventArgs e) 
    { 
     if (_currAddress == null) return; //if the current address is My Computer 
     _DraggedItems.Clear(); 
     foreach (ListViewItem item in listLocal.SelectedItems) 
     { 
      _DraggedItems.Add((ListViewItem)item.Clone()); 
     } 
     // if (some condition) call the same listview **listLocal.DoDragDrop** 
     listLocal.DoDragDrop(e.Item, DragDropEffects.All); 
     // else     call the other listview 
     listView1.DoDragDrop(e.Item, DragDropEffects.All); 
    } 

也當的DragDrop發射一個ListView我需要我條件檢查,如果拖曳的項目來自同一個列表視圖或沒有。

private void listView1_DragDrop(object sender, DragEventArgs e) 
    { 
     Point p = listView1.PointToClient(MousePosition); 
     ListViewItem targetItem = listView1.GetItemAt(p.X, p.Y); 
     // if (some condition)  
     //here i need to check if the dragged item came from the same listview or not 
     { 
      if (targetItem == null) 
      { 
       PreSend(currAddress);   //send to the current address 
      } 
      else 
      { 
       PreSend(targetItem.ToolTipText);  //send to the target folder 
      } 
      return; 
     } 
     //otherwise 

     if (targetItem == null) { return; }   //if dropped in the same folder return 

     if ((e.Effect & DragDropEffects.Move) == DragDropEffects.Move) 
     { 
      Thread thMove = new Thread(unused => PasteFromMove(targetItem.ToolTipText, DraggedItems)); 
      thMove.Start(); 
     } 
     else 
     { 
      Thread thCopy = new Thread(unused => PasteFromCopy(targetItem.ToolTipText, DraggedItems)); 
      thCopy.Start(); 
     } 
    } 

回答

2

您需要實施DragEnter事件來驗證是否正在拖動正確的對象。您可以使用ListViewItem.ListView屬性來驗證它來自另一個ListView。像這樣:

private void listView1_DragEnter(object sender, DragEventArgs e) { 
     // It has to be a ListViewItem 
     if (!e.Data.GetDataPresent(typeof(ListViewItem))) return; 
     var item = (ListViewItem)e.Data.GetData(typeof(ListViewItem)); 
     // But not one from the same ListView 
     if (item.ListView == listView1) return; 
     // All's well, allow the drop 
     e.Effect = DragDropEffects.Copy; 
    } 

DragDrop事件處理程序不需要進一步檢查。

+0

是否有任何問題,如果我使用DragOver而不是DragEnter,因爲在DragEnter中我不能使用控制按鈕更改e.Effect。如果你知道我的意思 – 2012-04-29 21:58:16

+0

我不知道,但是DragOver有助於做點擊測試來選擇放置某物的確切位置。就像一個只有少量項目和大量空白的ListView。您可以使用ListView.HitTest()來查找光標所在的位置。使用其PointToClient()方法將DragOver中傳遞的屏幕座標的光標座標映射到控制座標。 – 2012-04-29 22:03:41

+0

酷我使用PointToClient突出顯示一個文件夾(項目)之前丟棄項目,它工作時,我DragDrop在同一個列表視圖,但是當我從另一個列表視圖,突出顯示不起作用,我使用'item.Selected = true'突出顯示,我用'listView.Focus'和'listView.Select'仍然不工作。你有什麼主意嗎? – 2012-04-30 01:34:59

相關問題