文章目錄
- 前言
- 一、實現
前言
winform中的listBox實現拖拽!
一、實現
winform中的listbox實現拖拽只需要實現四個事件
1、準備兩個listbox控件
其中listtarget,AllowDrop屬性設置為True。
2、實現四個事件
2.1MouseDown
//在 MouseDown 事件期間,如果從鼠標位置起鼠標移動的距離大于 SystemInformation.DragSize,則啟動拖動動作。
private void ListSource_MouseDown(object sender, MouseEventArgs e)
{//ListBox中Item項的索引indexOfItemUnderMouseToDrag = listSource.IndexFromPoint(e.X, e.Y);//鼠標懸停在列表框的??有效項??上(即 indexOfItemUnderMouseToDrag不是 -1)if (indexOfItemUnderMouseToDrag != ListBox.NoMatches){//記錄鼠標按下位置,DragSize獲取以鼠標按鈕的按下點為中心的矩形的寬度和高度,在該矩形內不會開始拖動操作。Size dragSize = SystemInformation.DragSize;//創建一個矩形區域(正方形)。以鼠標按下電為中心,以DragSize為高和寬的矩形。dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width / 2), e.Y - (dragSize.Height / 2)), dragSize);}else{//如果鼠標沒有選中ListBox項,則置矩形區域為空dragBoxFromMouseDown = Rectangle.Empty;}
}
2.2MouseMove
private void ListSource_MouseMove(object sender, MouseEventArgs e)
{/** 鼠標按鈕狀態是用??位標志(bit flags)??存儲的:每個按鈕對應一個二進制位可以同時檢測多個按鈕的狀態&(按位與)操作可以提取特定按鈕的狀態* */if ((e.Button & MouseButtons.Left) == MouseButtons.Left){if (dragBoxFromMouseDown != Rectangle.Empty &&!dragBoxFromMouseDown.Contains(e.X,e.Y)){//傳遞ListBox選中項并觸發DoDragDrop事件(這里可以是ListDragSoure觸發,也可以是ListDragTarget)//DoDragDrop 方法確定當前光標位置下的控件。然后它將檢查該控件是否是有效的放置目標。DragDropEffects dropEffect = listSource.DoDragDrop(listSource.Items[indexOfItemUnderMouseToDrag], DragDropEffects.All | DragDropEffects.Link);if(dropEffect != DragDropEffects.None){listSource.Items.RemoveAt(indexOfItemUnderMouseToDrag);if (indexOfItemUnderMouseToDrag > 0)listSource.SelectedIndex = indexOfItemUnderMouseToDrag - 1;else if (listSource.Items.Count > 0)listSource.SelectedIndex = 0;}}}
}
2.3DragDrop
private void Listtarget_DragDrop(object sender, DragEventArgs e)
{if (e.Data.GetDataPresent(typeof(String))){Object item = e.Data.GetData(typeof(String));if(e.Effect == DragDropEffects.Copy || e.Effect == DragDropEffects.Move){listtarget.Items.Add(item);}}
}
2.4DragEnter
/*
當用戶拖動數據進入目標控件(例如一個ListBox或其他控件)時,此方法會被調用。
通過設置e.Effect = DragDropEffects.Move;,它告訴系統當前控件接受拖放操作,并且操作的類型是“移動”。
這個設置會改變鼠標光標的顯示(通常會顯示一個移動圖標),給用戶視覺反饋,表明松開鼠標后數據將被移動到這里。*/
private void Listtarget_DragEnter(object sender, DragEventArgs e)
{e.Effect = DragDropEffects.Move;
}
2.5綁定事件
private int indexOfItemUnderMouseToDrag;
private Rectangle dragBoxFromMouseDown;
public Form1()
{InitializeComponent();listSource.Items.AddRange(new string[] { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" });listSource.MouseDown += ListSource_MouseDown;listSource.MouseMove += ListSource_MouseMove;listtarget.DragDrop += Listtarget_DragDrop;listtarget.DragEnter += Listtarget_DragEnter;
}
效果圖
注意:如果你的窗體內未使用Combox控件,則看這篇文章就行了。
如果使用到了Combox控件,建議看一下這篇文章“解決winform中的listbox實現拖拽時,遇到combox控件會閃爍的問題”。