2013-05-16 75 views
2

我试图建立一个简单的界面,允许用户将文件放入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一样大。当有人将文件从列表中拖出时,他们会将其从表单中完全拖出。我是否通过这样做来支持自己进入角落?我承认自己比自己的努力更难,但我仍然希望看到如果可能的话它会如何工作。

+1

不要让用户通过将其拖到“ListBox”之外来移除该项目,您可以让DragDrop目标为用户拖动以将其移除。在这种情况下,您可以将'lb.Items.Remove(lb.SelectedItem);'移动到该目标控件上的'DragDrop'事件处理程序。 – Bolu

+0

另一种替代方法是在lb.Items.Remove(lb。)之前提供一个警报'messagebox'。SelectedItem);'以双重确认用户。 – Bolu

+0

将垃圾桶图标放在窗体上。现在对用户和代码都很清楚。 –

回答

3

这里有一个相当快的黑客的方法来获得的功能你想要的:

public object lb_item = null; 



private void listBox1_DragLeave(object sender, EventArgs e) 
{ 
    ListBox lb = sender as ListBox; 

    lb_item = lb.SelectedItem; 
    lb.Items.Remove(lb.SelectedItem); 
} 

private void listBox1_DragEnter(object sender, DragEventArgs e) 
{  
    if (lb_item != null) 
    { 
     listBox1.Items.Add(lb_item); 
     lb_item = null; 
    } 
} 


private void listBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    lb_item = null; 

    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 Form1_DragDrop(object sender, DragEventArgs e) 
{    
    lb_item = null; 
} 

每当用户拖动某项开箱即用,它暂时保存,直至用户删除它else或鼠标某处上列表中的新项目。 请注意,这里的重要部分是检测用户何时何地离开该鼠标,这是处理DragDrop事件Form1事件的基本原理,该事件为listBox1的母公司。

根据其他布局的复杂程度和密度,您处理DragDrop的方法可能会有很大不同。这就是为什么它是“黑客”,但它也很简单。但是,无论您在何处或多少次都无效,因为它仅适用于特定的ListBox

我想另一种方法是跟踪用户的鼠标状态并采取相应的行动,如果处理很多DragDrop的东西是不可想象的,这可能更适合您。

编辑:如果你想成为真正的彻底的,你可以通过使用枚举foreach控制的基本形式和程序追加的处理程序DragDrop事件到控制,然后在完成时将其删除......但这可能会变得有点疯狂。我相信有人有更好的方法。

+0

真棒,@glace!谢谢!全局变量是一个很好的补充,也是我错过的一个关键部分。我更新了我的问题以澄清我的目标。如果我将它从表单中拖出来,我该怎么办?我是否只需在表单中添加一个'DragEnter'事件处理程序? – tmoore82

+0

嗯......我不确定。尝试一下,捣乱一下,看看事件是否被绊倒。必须有一种方法可以做到这一点,我很惊讶别人没有提出更好的解决方案。 –

+0

您的解决方案也允许我拖放表单。没有必要的改变。谢谢! – tmoore82