4

我正在尝试构建一个简单的界面,允许用户将文件拖放到 alistBox中以将它们添加到进程中,并将它们拖出以删除它们。一切工作正常,但我想添加一个功能,让它更复杂一点。

现在,我删除了与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/05/16

到目前为止的评论和答案很有用,但我意识到我的问题还不够清楚。在这种情况下,我将显示一个与父窗体分开的对话框,该对话框基本上与listBox. 当有人将文件拖出列表时,他们将其完全拖出表单。我这样做是不是把自己逼到了墙角?我承认我正在让它变得比它必须的更难,但我仍然想看看如果可能的话它会如何工作。

4

1 回答 1

5

这是获得所需功能的一种相当快速的破解方法:

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;
}

每次用户将一个项目拖出盒子时,它都会被临时保存,直到用户将它放到其他地方或将鼠标放在列表中的新项目上。DragDrop请注意,其中的重要部分是检测用户何时何地松开鼠标,这是处理 的事件(Form1的父级 )背后的基本原理listBox1

根据布局其余部分的复杂程度和密度,您处理的位置DragDrop可能会有很大不同。这就是为什么它有点“hacky”,但它也很简单。但是,您在哪里或多少次 null 无关紧要,lb_item因为它仅与特定ListBox的 .

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

编辑:如果您想真正彻底,您可以使用基本表单的每个foreach控件进行枚举,并以编程方式将 DragDrop 事件的处理程序附加到该控件,然后在完成后将其删除......但这可能有点疯狂. 我敢肯定有人有更好的方法。

于 2013-05-16T19:47:46.063 回答