2014-02-06 108 views
0

我试着去实现ListViewItemsDragDrop重新整理我的名单。C#ListView控件的DragDrop重新排序不能正常工作

列表不会按照我的预期重新排序或移动项目。

代码

private void lstModules_DragDrop(object sender, DragEventArgs e) 
    { 
     if (e.Data.GetDataPresent(typeof(ListViewItem))) 
     { 
      lstModules.Alignment = ListViewAlignment.Default; 
      if (lstModules.SelectedItems.Count == 0) 
       return; 

      var p = lstModules.PointToClient(new System.Drawing.Point(e.X, e.Y)); 

      ListViewItem MovetoNewPosition = lstModules.GetItemAt(p.X, p.Y); 

      if (MovetoNewPosition == null) 
       return; 

      ListViewItem DropToNewPosition = (e.Data.GetData(typeof(ListView.SelectedListViewItemCollection)) as ListView.SelectedListViewItemCollection)[0]; 
      ListViewItem CloneToNew = (ListViewItem)DropToNewPosition.Clone(); 

      int index = MovetoNewPosition.Index; 
      lstModules.Items.Remove(DropToNewPosition); 
      lstModules.Items.Insert(index, CloneToNew); 

      lstModules.Alignment = ListViewAlignment.SnapToGrid; 


     } 

    } 


    private void lstModules_DragEnter(object sender, DragEventArgs e) 
    { 

     if (e.Data.GetDataPresent(typeof(ListView.SelectedListViewItemCollection))) 
     { 
      e.Effect = DragDropEffects.Move; 
     } 

    } 


    private void lstModules_ItemDrag(object sender, ItemDragEventArgs e) 
    { 
     lstModules.DoDragDrop(lstModules.SelectedItems, DragDropEffects.Move); 
    } 

回答

0

最近我做了这个代码试试这个。

private ListViewItem tempItem = null; 
private void lvTables_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
    { 
     Application.DoEvents(); 
     tempItem = lvTables.GetItemAt(e.X, e.Y); 
     string sData = tempItem.Text + ":" + tempItem.Name; 
     DragDropEffects effect = DoDragDrop(sData, DragDropEffects.Move); 
     lvTables.Refresh(); 
    }  
} 

private void lvTables_DragEnter(object sender, DragEventArgs e) 
{ 

    if (e.Data.GetDataPresent(DataFormats.StringFormat)) 
     e.Effect = DragDropEffects.Move; 
    else 
     e.Effect = DragDropEffects.None; 
} 

private void lvTables_DragOver(object sender, DragEventArgs e) 
{ 
    if (tempItem != null && lvTables.Items.Contains(tempItem)) 
    { 
     Application.DoEvents(); 
     int iIndex = -1; 
     try 
     { 
      Point p = lvTables.PointToClient(new Point(e.X, e.Y)); 
      iIndex = lvTables.GetItemAt(p.X, p.Y).Index; 
     } 
     catch 
     { } 
     if (iIndex > -1 && iIndex != tempItem.Index) 
     { 
      if (lvTables.Items.Contains(tempItem)) 
       lvTables.Items.Remove(tempItem); 
      lvTables.Items.Insert(iIndex, tempItem); 
      tempItem.Selected = true; 
     } 
    } 
} 

private void lvTables_MouseUp(object sender, MouseEventArgs e) 
{ 
    if (tempItem != null) 
    { 
     lvTables.SelectedItems.Clear(); 
     tempItem.Selected = true; 
     tempItem = null; 
    } 
}