4

ユーザーがファイルをドロップlistBoxしてプロセスに追加し、ドラッグして削除できるシンプルなインターフェイスを構築しようとしています。すべてが正常に機能していますが、機能を 1 つ追加して、もう少し洗練されたものにしたいと思います。

現在、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イベントを処理する根拠となります。Form1listBox1

レイアウトの残りの部分の洗練度と密度に応じて、処理する場所DragDropが大きく異なる可能性があります。これが一種の「ハッキー」な理由ですが、非常に単純でもあります。ただし、それはlb_itemその特定のListBox.

それを行う別の方法は、ユーザーのマウスの状態を追跡し、それに応じて行動することだと思います。これは、多くのものを処理することが考えられない場合に適していますDragDrop

編集: REAL を徹底したい場合は、基本フォームのすべてのコントロールを列挙foreachし、DragDrop イベントのハンドラーをプログラムでそのコントロールに追加し、完了したら削除することができます... . 誰かがより良いアプローチを持っていると確信しています。

于 2013-05-16T19:47:46.063 に答える