簡體   English   中英

C#從listBox拖放

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM