public Form1()
{
InitializeComponent();
// Hook up the form event handler.
this.Load += new EventHandler(Form1_Load);
}
private void Form1_Load(object sender, EventArgs e)
{
// Allow data to be dropped on both ListBoxes.
this.listBox1.AllowDrop = true;
this.listBox2.AllowDrop = true;
// Populate the ListBoxes.
this.listBox1.Items.AddRange(new string[] {"List 1, Item 1",
"List 1, Item 2",
"List 1, Item 3",
"List 1, Item 4",
"List 1, Item 5"});
this.listBox2.Items.AddRange(new string[] {"List 2, Item 1",
"List 2, Item 2",
"List 2, Item 3",
"List 2, Item 4",
"List 2, Item 5"});
// Hook up the ListBox event handlers.
this.listBox1.MouseDown += new MouseEventHandler(ListBox_MouseDown);
this.listBox2.MouseDown += new MouseEventHandler(ListBox_MouseDown);
this.listBox1.DragEnter += new DragEventHandler(ListBox_DragEnter);
this.listBox2.DragEnter += new DragEventHandler(ListBox_DragEnter);
this.listBox1.DragDrop += new DragEventHandler(ListBox_DragDrop);
this.listBox2.DragDrop += new DragEventHandler(ListBox_DragDrop);
}
void ListBox_MouseDown(object sender, MouseEventArgs e)
{
ListBox source = (ListBox)sender;
for (int index = 0; index < source.Items.Count; index++)
{
// Test whether the mouse location is within an item
if (source.GetItemRectangle(index).Contains(e.Location))
{
// The mouse was depressed on an item so allow a move operation.
source.DoDragDrop(source, DragDropEffects.Move);
break;
}
}
}
void ListBox_DragEnter(object sender, DragEventArgs e)
{
ListBox source = (ListBox)sender;
if (e.Data.GetDataPresent("System.Windows.Forms.ListBox", false) &&
e.Data.GetData("System.Windows.Forms.ListBox", false) != source)
{
// The data being dragged is a ListBox but not the one that was just entered.
e.Effect = DragDropEffects.Move;
}
}
void ListBox_DragDrop(object sender, DragEventArgs e)
{
ListBox source = (ListBox)sender;
if (e.Data.GetDataPresent("System.Windows.Forms.ListBox", false))
{
// Get the ListBox that the data was dragged from.
ListBox data = (ListBox)e.Data.GetData("System.Windows.Forms.ListBox", false);
// Make sure we aren't trying to drag from and drop to the same control.
if (data != source)
{
// Get the item that was dragged.
object item = data.SelectedItem;
// Remove the item from its original location.
data.Items.Remove(item);
// Get the current mouse location relative to the control being dropped on.
Point location = source.PointToClient(new Point(e.X, e.Y));
int dropIndex = -1;
// Find the item over which the mouse was released.
for (int index = 0; index < source.Items.Count; index++)
{
if (source.GetItemRectangle(index).Contains(location))
{
dropIndex = index;
break;
}
}
if (dropIndex == -1)
{
// The mouse was not released over an item so add the new item to the end.
source.Items.Add(item);
}
else
{
// Insert the new item above the item it was dropped on.
source.Items.Insert(dropIndex, item);
}
}
}
}