2010-11-01 92 views
1

我想創建一個獨立的Winforms控件,稱爲DragDropListView。它來自ListView。C#拖放ListViews

我有代碼允許用戶通過在新位置拖放項目來對控件中的列表項進行排序。我通過重寫OnDragDrop,OnDragOver,OnDragEnter,OnItemDrag來實現。

我遇到的問題是從一個listview拖到一個完全不同的listview。事件在其他列表視圖上按預期觸發,但該方法沒有采用「發件人」參數,因此沒有辦法確定項目是從哪裏拖出的,也沒有辦法找到實際抓取項目被拖動。當前的代碼適用於像「this.SelectedItems」這樣的東西,但我希望它是「sender.SelectedItems」。

我猜沒有發件人參數的原因是控件不應該負責知道它的環境,主機窗體應該處理兩個控件之間的交互,但我試圖構建自包含的具有此功能的控件,因此讓它流到窗體上不起作用。

想法?

回答

1

我想你可以通過listViewItem.ListView財產知道從項目ListView,檢查它。

我沒有測試代碼:

private void listView1_DragEnter(object sender, DragEventArgs e) 
{ 
    if (!e.Data.GetDataPresent(typeof(ListView.ListViewItemCollection))) 
    { 
     e.Effect = DragDropEffects.None; 
     return; 
    } 

    var items = (ListView.ListViewItemCollection)e.Data.GetData(typeof(ListView.ListViewItemCollection)); 

    if (items.Count > 0 && items[0].ListView != listView1) 
    { 
     e.Effect = DragDropEffects.None; 
     return; 
    } 
} 

檢查DragEventArgs,此樣品中CodeProject [VB.Net] 祝你好運!

+0

這是一個很好的想法,但請記住,如果從不同的ListView中拖動項目,我不一定會拖動項目 - 我只能通過this.SelectedItems訪問項目,如果「this」不是該物品的來源,那麼我認爲我不能得到該物品。合理? – 2010-11-01 22:41:26

+0

不,你可以,你可以通過DragEventArgs得到它,我會編輯我的答案並添加代碼。 – Homam 2010-11-01 22:45:16