现在在C#中处理有关的拖放操作变得比以前方便多了,现在就已一个例子说明,这个例子演示了通过鼠标的拖动在一个ListBox中进行排序操作。
相关源码如下:
using System;using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace WindowsApplication2
{
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.ListBox listBox1;
int indexofsource;//拖动的起始索引
int indexoftarget; //拖动的结束索引
private System.ComponentModel.Container components = null;
public Form1()
{
InitializeComponent();
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}
Windows 窗体设计器生成的代码
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void listBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
indexofsource = ((ListBox)sender).IndexFromPoint(e.X, e.Y);
if (indexofsource != ListBox.NoMatches)
{
((ListBox)sender).DoDragDrop(((ListBox)sender).Items[indexofsource].ToString(), DragDropEffects.All);
}
}
private void listBox1_DragOver(object sender, System.Windows.Forms.DragEventArgs e)
{ //拖动源和放置的目的地一定是一个ListBox
if (e.Data.GetDataPresent(typeof(System.String)) && ((ListBox)sender).Equals(listBox1))
{
e.Effect = DragDropEffects.Move;
}
else
e.Effect = DragDropEffects.None;
}
private void listBox1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
ListBox listbox = (ListBox)sender;
indexoftarget = listbox.IndexFromPoint(listbox.PointToClient(new Point(e.X, e.Y)));
if (indexoftarget != ListBox.NoMatches)
{
string temp = listbox.Items[indexoftarget].ToString();
listbox.Items[indexoftarget] = listbox.Items[indexofsource];
listbox.Items[indexofsource] = temp;
listbox.SelectedIndex = indexoftarget;
}
}
}
}
好了,现在我们的目标达到了。我们还可以通过处理QueryContinueDrag、GiveFeedback事件获得更多的功能。