DOBON.NET DOBON.NETプログラミング掲示板過去ログ

エクスプローラへのドラッグ&ドロップで移動された場合の判定について

環境/言語:[WinXP VB.NET2003 .NETFramework1.1.4322]
分類:[.NET]

2004/02/11(Wed) 11:31:40 編集(投稿者)

関連記事 No2064,2142,2257
関連Tips どぼん!ドラッグ&ドロップを行う

こちら記事を見て、リストビュー内をドラッブ&ドロップでエクスプローラに
コピー又は移動するプログラムを作成しました。(リストビュー内はテキスト)
コピーはうまくいくのですが、エクスプローラでドラッグする際、Shiftキー
を押し移動にすると、ファイル自身の移動は正しく行われるのですが、
リストビュー内のリストの削除ができません。
ソースのデバッグでは、DragDropEffectsがMoveではなく、Noneになってしまいます。
リストビューをリストボックスにしても同様でした。

行いたいことは、
1.移動されたファイルはリストから削除したい
2.ドロップできない箇所へドロップされた場合は無視したい

どのように実現したらよいでしょうか。
お手数ではございますが、お教え願えませんでしょうか。

以下ソースコード

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ListView1.Items.Add("C:\test1.txt")
        ListView1.Items.Add("C:\test2.txt")
        ListView1.View = View.List
    End Sub

    Private Sub ListView1_ItemDrag(ByVal sender As Object, ByVal e As System.Windows.Forms.ItemDragEventArgs) Handles ListView1.ItemDrag

        Dim Files As String()
        Dim FilesCnt As Integer = 0

        Dim i As Integer
        For i = 0 To 1
            If ListView1.Items(i).Selected = True Then
                FilesCnt += 1
                ReDim Preserve Files(FilesCnt - 1)
                Files(FilesCnt - 1) = ListView1.Items(i).Text
            End If
        Next
        Dim myDataObject As New DataObject(DataFormats.FileDrop, Files)
        Dim dde As DragDropEffects = ListView1.DoDragDrop(myDataObject, DragDropEffects.All)

        'SHIFT+ドラッグで移動した場合、ここ以下が正しく動作しません。
        If dde = DragDropEffects.Move Then
            'dde = None となり、ここには到達しない
            For i = 1 To 0
                If ListView1.Items(i).Selected = True Then
                    ListView1.Items.RemoveAt(i)
                End If
            Next
        End If
    End Sub

ここまで
大変おそれいりますがよろしくお願い致します。
Mike3さん、こんにちは。深山と申します。

 調べてみたところ、過去いつくかのメーリングリストで同様の質問がされてるようでした。
結論からいうと、 DoDragDrop メソッドの戻り値はドロップされるアプリケーション次第なので
あまりあてにならないようです(^_^;)

 MSDN にもアプリケーション間でドラッグ アンド ドロップをするには
『両方のアプリケーションが AllowedEffect プロパティと Effect プロパティの間で確立された
"契約" に従って動作する必要があります。』
と書かれてますし、エクスプローラはこれに当てはまらないということになる‥‥のかな?

■引用■アプリケーション間でのドラッグ アンド ドロップ操作の実行
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcon/html/vbtskperformingdragdropbetweenapplications.asp


 私もよく解らないですけど、XP でエクスプローラへドロップ(移動)したときに None が返ってくる
のは正常な動作みたいです。
 なので上手くいかない‥‥だけではあんまりなので回避策を。


回避策1:
 DoDragDrop の結果が Copy ではなかったら、ドラッグされたファイルが元のパスに存在して
いるかどうか確認。なければ移動したと判断してリストより削除。

回避策2:
 QueryContinueDrag イベントを用いる。 Action が Drop のときの KeyState をチェック、
Ctl キーが押されてなければ移動したと判断してリストより削除。


 こちらで試した限りでは問題なく動いたようですけど、どうでしょうか?
深山様
 はじめまして。
 的確なご返事ありがとうございます。
 回避策1の様な発想の転換が思いつきませんでした。
 基本を回避策1で行うことにしました。

 勉強のため、回避策2でも動作確認してみます。

 調べていただき、お手間をとらせてしまいました。
 この場を借りてお礼申し上げます。    


又、この記事を読んで頂いた方に感謝いたします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板