0

ファイルをにドラッグアンドドロップできるプログラムを作成しようとしていますListView。私はListView.InsertionMarkファイルを挿入する場所を識別するために使用します。ファイルをドロップしても、イベントがトリガーされないInsertionMarkため、は消えません。DragLeaveドラッグアンドドロップ効果をに変更すると、マウスを離したときDragDropEffects.NoneDragLeaveイベントがトリガーされます。なぜこうなった?

また、ドキュメントには、「キーボードまたはマウスボタンの状態が変化した場合、イベントが発生し、ドラッグを続行するか、データをドロップするか、またはプロパティのQueryContinueDrag値に基づいて操作をキャンセルするかが決定されます。ActionイベントのQueryContinueDragEventArgs。」ただし、QueryContinueDragイベントもトリガーされません。

public partial class MainForm : Form
{
    private ListView listView1 = new ListView();

    public MainForm()
    {
        InitializeComponent();

        this.Controls.Add(listView1);

        listView1.Dock = DockStyle.Fill;
        listView1.View = View.Details;
        listView1.Columns.Add("Test");
        listView1.Items.Add("0");
        listView1.AllowDrop = true;

        listView1.DragEnter += listView1_DragEnter;
        listView1.DragOver += listView1_DragOver;
        listView1.DragLeave += listView1_DragLeave;
        listView1.DragDrop += listView1_DragDrop;
        listView1.GiveFeedback += listView1_GiveFeedback;
        listView1.QueryContinueDrag += listView1_QueryContinueDrag;
    }

    private void listView1_DragEnter(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(DataFormats.FileDrop))
        {
            e.Effect = DragDropEffects.Link | DragDropEffects.Scroll;
        }
        else
        {
            e.Effect = DragDropEffects.None;
        }
    }

    private void listView1_DragOver(object sender, DragEventArgs e)
    {
        // This is not done, only to show this problem.
        listView1.InsertionMark.Index = 0;
        listView1.InsertionMark.AppearsAfterItem = true;
    }

    private void listView1_DragLeave(object sender, EventArgs e)
    {
        listView1.InsertionMark.Index = -1;
    }

    private void listView1_DragDrop(object sender, DragEventArgs e)
    {
        // listView1.InsertionMark.Index = -1; // Is this really necessary?
    }

    private void listView1_QueryContinueDrag(object sender, QueryContinueDragEventArgs e)
    {
        this.Text = "listView1_QueryContinueDrag";
    }

    private void listView1_GiveFeedback(object sender, GiveFeedbackEventArgs e)
    {
        this.Text = "listView1_GiveFeedback";
    }
}

listView1.InsertionMark.Index = -1非表示にするには手動で設定する必要がありInsertionMarkますか?DragLeaveドラッグドロップ効果がのときにイベントをトリガーする方法はありDragDropEffects.Linkますか?

4

1 に答える 1

1

ファイルをドロップしても、イベントがトリガーされないInsertionMarkため、は消えません。DragLeave

DragLeave

このDragLeaveイベントは、ユーザーがカーソルをコントロールの外にドラッグしたとき、またはユーザーが現在のドラッグアンドドロップ操作をキャンセルしたときに発生します。

(強調追加)

彼らはどちらもしませんでした-彼らはドロップを完了しました。このイベントがその時発火しなかったのになぜあなたはとても驚いていますか?


QueryContinueDrag::

このQueryContinueDragイベントにより、ドラッグソースは、ドラッグアンドドロップ操作をキャンセルする必要があるかどうかを判断できます。

(強調追加)

私はここで間違っている可能性がありますが、この場合、あなたはドラッグターゲットであり、ソースではないように見えます。

于 2012-08-23T14:24:20.753 に答える