Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#从列表框拖放_C#_Drag And Drop_Event Handling - Fatal编程技术网

C#从列表框拖放

C#从列表框拖放,c#,drag-and-drop,event-handling,C#,Drag And Drop,Event Handling,我试图构建一个简单的界面,允许用户将文件放入列表框,将其添加到进程中,并将其拖出以删除。一切都很好,但我想添加一个功能,使它更复杂一点 现在,我已经删除了与DragLeave事件相关的项,这意味着一旦鼠标离开框,该项就被删除。但我希望用户能够改变他们的想法。换句话说,如果他们意识到他们拖出了错误的文件,我希望他们能够将鼠标移回列表框,然后释放鼠标取消操作。我认为这意味着我需要能够捕获MouseUp事件,而不是DragLeave事件。但到目前为止还没有成功 下面是我当前用于删除拖出的文件的代码。在

我试图构建一个简单的界面,允许用户将文件放入
列表框
,将其添加到进程中,并将其拖出以删除。一切都很好,但我想添加一个功能,使它更复杂一点

现在,我已经删除了与
DragLeave
事件相关的项,这意味着一旦鼠标离开框,该项就被删除。但我希望用户能够改变他们的想法。换句话说,如果他们意识到他们拖出了错误的文件,我希望他们能够将鼠标移回
列表框
,然后释放鼠标取消操作。我认为这意味着我需要能够捕获
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


到目前为止,这些评论和回答都很有用,但我意识到我的问题还不够清楚。在本例中,我将显示一个与父窗体分离的对话框,该对话框基本上与
列表框一样大。当有人从列表中拖出一个文件时,他们是在将其完全从表单中拖出。我这样做是不是让自己陷入了困境?我知道我正在使它变得比必须的更难,但如果可能的话,我仍然想看看它将如何工作。

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

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;
}
每次用户从框中拖出一个项目时,它都会被临时保存,直到用户将其放在其他地方或鼠标移到列表中的一个新项目上。 请注意,这项工作的重要部分是检测用户何时何地释放鼠标,这是处理
Form1
DragDrop
事件的基本原理,Form1是
listBox1
的父项

根据布局其余部分的复杂度和密度,处理DragDrop的位置可能会有很大不同。这就是为什么它有点“黑”,但它也很简单。不过,在何处或多少次为空
lb_项
,并不重要,因为它只与特定的
列表框
相关

我想另一种方法是跟踪用户的鼠标状态并相应地采取行动,如果处理大量
DragDrop
内容是不可想象的,那么这可能更适合您


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

您可以创建一个DragDrop目的地,供用户拖动以删除该项目,而不是让用户通过将其拖动到
列表框之外来删除该项目。在这种情况下,您可以移动
lb.Items.Remove(lb.SelectedItem)
到该目标控件上的
DragDrop
事件处理程序。另一种替代方法是在
lb.Items.Remove(lb.SelectedItem)之前提供一个警报
messagebox
与用户再次确认。在表单上放置垃圾桶图标。现在,您的用户和代码都清楚了。@HansPassant,我尝试过这个,但无法使DragDrop事件工作。我使用了与上面相同的事件处理程序。没有反应。@Bolu,谢谢!这两个建议都很好。我修改了我的问题以澄清我的目标,但这是一个很好的临时解决方案。太棒了,@glace!谢谢全局变量是一个很好的补充,也是我遗漏的一个关键部分。我更新了我的问题以澄清我的目标。如果我把它从表单上拖下来怎么办?我是否只是将一个
DragEnter
事件处理程序作为一个整体添加到表单中。。。我不确定。试一试,四处乱逛,看看这些事件是否会被绊倒。必须有办法做到这一点,我很惊讶没有其他人提出更好的解决方案。您的解决方案也允许我在表单上拖拉和拖拉。无需更改。谢谢