2013-06-24 87 views
0

我剛剛爲CheckedListBox實現了拖放重新排序功能。現在我希望它向下滾動,如果拖到底部,反之亦然頂部(一個正常拖動自動滾動)使用DragDrop重新排序的自動滾動CheckedListBox

我已經找到了大量的WPF信息,但我沒有看到如何將這些解決方案應用到我的winform ChekedListBox。

這裏是我的代碼:

 private void myListBox_DragOver(object sender, DragEventArgs e) 
     { 
      e.Effect = DragDropEffects.Move; 

      Point point = myListBox.PointToClient(new Point(e.X, e.Y)); 

      int index = myListBox.IndexFromPoint(point); 
      int selectedIndex = myListBox.SelectedIndex; 

      if (index < 0) 
      { 
       index = selectedIndex; 
      } 

      if (index != selectedIndex) 
      { 
       myListBox.SwapItems(selectedIndex, index); 
       myListBox.SelectedIndex = index; 
      } 
     } 

回答

1

您可以更新Timer.Tick事件處理程序中的CheckedListBox.TopIndex屬性來實現自動滾動功能。要啓動和停止計時器,請使用CheckedListBox.DragLeaveCheckedListBox.DragEnter事件。這裏是一個代碼片段:

private void checkedListBox1_DragEnter(object sender, DragEventArgs e) { 
    scrollTimer.Stop(); 
} 

private void checkedListBox1_DragLeave(object sender, EventArgs e) { 
    scrollTimer.Start(); 
} 

private void scrollTimer_Tick(object sender, EventArgs e) { 
    Point cursor = PointToClient(MousePosition); 
    if (cursor.Y < checkedListBox1.Bounds.Top) 
     checkedListBox1.TopIndex -= 1; 
    else if (cursor.Y > checkedListBox1.Bounds.Bottom) 
     checkedListBox1.TopIndex += 1; 
} 
+0

謝謝。似乎有點hacky,但非常聰明的實現......它的工作原理! – Christoffer

+0

雖然只有一個問題,但如果我在滾動時釋放鼠標按鈕(在列表框外),則代碼將保持啓動模式。 – Christoffer

0

我實際上已經把這個添加到我的DragOver事件處理程序中。也許不是光滑的,但它對我來說好一點。

private void myListBox_DragOver(object sender, DragEventArgs e) 
    { 
     e.Effect = DragDropEffects.Move; 

     Point point = myListBox.PointToClient(new Point(e.X, e.Y)); 

     int index = myListBox.IndexFromPoint(point); 
     int selectedIndex = myListBox.SelectedIndex; 

     if (index < 0) 
     { 
      index = selectedIndex; 
     } 

     if (index != selectedIndex) 
     { 
      myListBox.SwapItems(selectedIndex, index); 
      myListBox.SelectedIndex = index; 
     } 

     if (point.Y <= (Font.Height*2)) 
     { 
      myListBox.TopIndex -= 1; 
     } 
     else if (point.Y >= myListBox.Height - (Font.Height*2)) 
     { 
      myListBox.TopIndex += 1; 
     } 
    }