gpt4 book ai didi

C# 从列表框中拖放

转载 作者:太空狗 更新时间:2023-10-30 01:21:08 25 4
gpt4 key购买 nike

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

现在,我删除了与 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 一样大。当有人将文件拖出列表时,他们将其完全拖出表单。我这样做是不是把自己逼到了墙角?我知道我正在让它变得比它必须的更难,但我仍然想看看它是如何工作的,如果可能的话。

最佳答案

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

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

每次用户将项目拖出框时,它都会暂时保存,直到用户将其放在其他地方或将鼠标放在列表中的新项目上。请注意,其中的重要部分是检测用户何时何地离开鼠标,这是处理 Form1DragDrop 事件背后的基本原理, 的父级>列表框 1

根据布局其余部分的复杂程度和密度,处理 DragDrop 的位置对您来说可能会有很大不同。这就是为什么它有点“hacky”,但它也很简单。不过,将 lb_item 设置为 null 的位置或次数并不重要,因为它只与特定的 ListBox 相关。

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

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

关于C# 从列表框中拖放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16591975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com