尝试在2个列表框之间实现拖放,到目前为止我看到的所有示例都没有真正的味道。
有人能指点我或向我展示一个好的实施吗?
答案 0 :(得分:8)
这是一个示例表单。开始使用新的WF项目并在表单上放下两个列表框。使代码看起来像这样:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
listBox1.Items.AddRange(new object[] { "one", "two", "three" });
listBox1.MouseDown += new MouseEventHandler(listBox1_MouseDown);
listBox1.MouseMove += new MouseEventHandler(listBox1_MouseMove);
listBox2.AllowDrop = true;
listBox2.DragEnter += new DragEventHandler(listBox2_DragEnter);
listBox2.DragDrop += new DragEventHandler(listBox2_DragDrop);
}
private Point mDownPos;
void listBox1_MouseDown(object sender, MouseEventArgs e) {
mDownPos = e.Location;
}
void listBox1_MouseMove(object sender, MouseEventArgs e) {
if (e.Button != MouseButtons.Left) return;
int index = listBox1.IndexFromPoint(e.Location);
if (index < 0) return;
if (Math.Abs(e.X - mDownPos.X) >= SystemInformation.DragSize.Width ||
Math.Abs(e.Y - mDownPos.Y) >= SystemInformation.DragSize.Height)
DoDragDrop(new DragObject(listBox1, listBox1.Items[index]), DragDropEffects.Move);
}
void listBox2_DragEnter(object sender, DragEventArgs e) {
DragObject obj = e.Data.GetData(typeof(DragObject)) as DragObject;
if (obj != null && obj.source != listBox2) e.Effect = e.AllowedEffect;
}
void listBox2_DragDrop(object sender, DragEventArgs e) {
DragObject obj = e.Data.GetData(typeof(DragObject)) as DragObject;
listBox2.Items.Add(obj.item);
obj.source.Items.Remove(obj.item);
}
private class DragObject {
public ListBox source;
public object item;
public DragObject(ListBox box, object data) { source = box; item = data; }
}
}
答案 1 :(得分:1)
在.net中执行拖放控制的正确方法是在第二个控件的DragDrop事件处理程序中运行代码。
它可能“闻”怪异,但这就是它在.NET中的运作方式。
答案 2 :(得分:1)
Google给出了这个:http://www.codeproject.com/KB/dotnet/csdragndrop01.aspx
这似乎是一个非常合理的教程。如果它闻起来很糟糕,我认为更多的是使用API进行拖放操作而不是教程本身很差。