2012-07-23 64 views
2

我試圖通過拖放功能實現一個ObjectListView。考慮下面的類:ObjectListView中的可重新訂購項目

public class MyClass 
{ 
    public string Name { get; set; } 
    public MyClass(string name) 
    { 
     Name = name; 
    } 
} 

我得到了重新排序工作(但是這是非常,非常醜陋的),但我似乎無法找出我應該怎麼重新安排我的List<MyClass>這是什麼OLV正在顯示?我嘗試刪除OLV Selected Index位置上的MyClass對象,然後插入到新的位置,但這不起作用。

如果你需要它,這裏是我用來獲取查看拖放工作代碼:

private void objectListView1_ItemDrag(object sender, ItemDragEventArgs e) 
    { 
     DoDragDrop(((OLVListItem)e.Item).RowObject, DragDropEffects.Move); 
    } 

    private void objectListView1_DragEnter(object sender, DragEventArgs e) 
    { 
     e.Effect = e.Data.GetDataPresent("Cheeseburger.MyClass") ? DragDropEffects.Move : DragDropEffects.None; 
    } 

    private void objectListView1_DragOver(object sender, DragEventArgs e) 
    { 
     e.Effect = DragDropEffects.Move; 
     var olv = (sender as ObjectListView); 
     if(e.Data.GetDataPresent("Cheeseburger.MyClass")) 
     { 
      var pt = olv.PointToClient(new Point(e.X, e.Y)); 

      var index = olv.InsertionMark.NearestIndex(pt); 
      // Debugging 
      Text = index.ToString(); 
      var node = olv.GetItem(index); 

      if (node != null && index != -1) 
      { 
       node.EnsureVisible(); 
      } 
     } 
    } 


    private void objectListView1_DragDrop(object sender, DragEventArgs e) 
    { 
     e.Effect = DragDropEffects.Move; 
     var olv = (sender as ObjectListView); 
     if (e.Data.GetDataPresent("Cheeseburger.MyClass")) 
     { 
      var draggedObject = e.Data.GetData("Cheeseburger.MyClass") as MyClass; 
      var pt = olv.PointToClient(new Point(e.X, e.Y)); 

      var index = olv.InsertionMark.NearestIndex(pt); 
      var node = olv.GetItem(index); 

      if (node != null && index != -1) 
      { 
       var models = new List<MyClass>() { draggedObject }; 
       olv.MoveObjects(index + 1, models); 
      } 
     } 
    } 

如果我的問題沒有任何信息,請告訴我 - 謝謝!

回答

2

再次提出問題時,答案很明顯!

問題是這一行:

olv.MoveObjects(index + 1, models); 

正如我所說的,我嘗試使用插入和對象的列表中刪除,但沒有工作 - 那是因爲我在Insert忘了+ 1指數方法(只有在索引不是0的情況下,否則在放入列表中的第一個項目時會發生混亂)!

下面是該部分的修改後的代碼:

   var selIndex = olv.SelectedIndex; 
       var models = new List<MyClass>() { draggedObject }; 
       if (index != 0) index++; 
       olv.MoveObjects(index, models); 
       MyClasses.Insert(index,draggedObject); 
       MyClasses.RemoveAt(selIndex); 
+0

Downvoter,請自圓其說。如果花時間分享我的解決方案在這裏被認爲是錯誤的,我肯定不會再犯這個錯誤。 – Jeff 2012-07-23 15:10:31

+1

Upvoted因爲它幫助了我。 – 2014-01-28 05:00:10