[英]C# Drag and Drop From listBox
我正在嘗試構建一個簡單的界面,允許用戶將文件放入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
一樣大。 當有人將文件從列表中拖出時,他們會將文件完全拖離表單。 這樣做我是否支持自己進入角落? 我知道我正在努力使它變得更難,但我仍然希望看到它如果有可能會如何運作。
這是獲得所需功能的一種相當快速的黑客方法:
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”,但它也很簡單。 但是,無論你將lb_item
何處或多少次都lb_item
因為它僅適用於特定的ListBox
。
我想另一種方法是跟蹤用戶的鼠標狀態並采取相應的行動,如果處理很多DragDrop
東西是不可思議的,這可能更適合你。
編輯:如果你想真正徹底,你可以使用foreach
枚舉基本表單的每個控件,並以編程方式將DragDrop事件的處理程序附加到該控件,然后在完成后刪除它...但這可能會得到一點點堅果。 我相信有人會有更好的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.