我试图建立一个简单的界面,允许用户将文件放入listBox
将其添加到进程,并将它们拖出来删除它们。一切工作正常,但我想添加一个功能,使其更加复杂一点。C#拖放从列表框
现在,我已移除绑定到DragLeave
事件的项目,这意味着只要鼠标离开盒子,该项目就会被移除。但我希望用户能够改变他们的想法。换句话说,如果他们意识到他们将错误的文件拖出来,我希望他们能够将鼠标移回listBox
并释放鼠标以取消操作。我想这意味着我需要能够捕获MouseUp
事件而不是DragLeave
事件。但迄今为止尚未取得成功。
下面是我目前用于删除拖出文件的代码。如何修改以防止从列表中删除文件,直到用户放开鼠标按钮?
private void listBox1_MouseDown(object sender, MouseEventArgs e)
{
if (listBox1.Items.Count == 0)
{
return;
}
int index = listBox1.IndexFromPoint(e.X, e.Y);
string s = listBox1.Items[index].ToString();
DragDropEffects dde1 = DoDragDrop(s, DragDropEffects.All);
}
private void listBox1_DragLeave(object sender, EventArgs e)
{
ListBox lb = sender as ListBox;
lb.Items.Remove(lb.SelectedItem);
}
编辑2013年5月16日
的意见和到目前为止的答案是有益的,但我知道我的问题是不够清晰。在这种情况下,我显示一个与父表单基本相同的对话框,其大小与listBox
一样大。当有人将文件从列表中拖出时,他们会将其从表单中完全拖出。我是否通过这样做来支持自己进入角落?我承认自己比自己的努力更难,但我仍然希望看到如果可能的话它会如何工作。
不要让用户通过将其拖到“ListBox”之外来移除该项目,您可以让DragDrop目标为用户拖动以将其移除。在这种情况下,您可以将'lb.Items.Remove(lb.SelectedItem);'移动到该目标控件上的'DragDrop'事件处理程序。 – Bolu
另一种替代方法是在lb.Items.Remove(lb。)之前提供一个警报'messagebox'。SelectedItem);'以双重确认用户。 – Bolu
将垃圾桶图标放在窗体上。现在对用户和代码都很清楚。 –