2009-06-17 10 views
10

私はリストボックスに名前を持つファイルのリストを持っていて、その内容はSQLテーブルに格納されており、私のアプリのユーザーはリストボックス内のファイル名の1つ以上を選択してデスクトップにドラッグできるようにしたい、デスクトップ上の実際のファイルを生成します。私はこれを行う方法に関するドキュメントを見つけることができません。誰か説明したり、説明を指摘できますか?.net winformsアプリケーションからデスクトップにドラッグするファイルを実装しますか?

追加: 私はDragLeaveイベントを処理することでこの作業を行うことができました。そこでは、選択した名前と内容をSQL Serverから取得した一時ディレクトリにファイルを作成します。私は、そのオブジェクトにファイルへのパスを置く:

var files = new string[1]; 
files[0] = "full path to temporary file"; 
var dob = new DataObject();  
dob.SetData(DataFormats.FileDrop, files); 
DoDragDrop(dob, DragDropEffects.Copy); 

しかし、これは非常に非効率的と不器用なようだ、と私はまだ蓄積された一時ファイルを取り除くための良い方法を考え出したていません。

答えて

10

多少お手伝いできます。ここでは、リストボックスから何かをドラッグできるようにするコードがあります。デスクトップにドロップすると、マシン上に存在するファイルのコピーがデスクトップに作成されます。

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     this.listBox1.Items.Add("foo.txt"); 
     this.listBox1.MouseDown += new MouseEventHandler(listBox1_MouseDown); 
     this.listBox1.DragOver += new DragEventHandler(listBox1_DragOver); 
    } 

    void listBox1_DragOver(object sender, DragEventArgs e) 
    { 
     e.Effect = DragDropEffects.Copy; 
    } 

    void listBox1_MouseDown(object sender, MouseEventArgs e) 
    { 
     string[] filesToDrag = 
     { 
      "c:/foo.txt" 
     }; 
     this.listBox1.DoDragDrop(new DataObject(DataFormats.FileDrop, filesToDrag), DragDropEffects.Copy); 
    } 
} 
+0

私はこれを理解していますが、私が理解していないのは、foo.txtが作成され、SQLテーブルの内容で埋められるところです。 – mlo

+0

"c:/foo.txt"を追加することは可能ですが、ドラッグが終了したら "new foo.txt"のような新しいファイル名でファイルをドロップしますか? – Nooneelse

3

はここでドラッグ操作を開始するときに判断するためにボイラープレートの一部です:

private Rectangle _DragRect; 

private void MyDragSource_MouseDown(object sender, MouseEventArgs e) { 
    Size dragsize = SystemInformation.DragSize; 
    _DragRect = new Rectangle(new Point(e.X - (dragsize.Width/2), e.Y - (dragsize.Height/2)), dragsize); 
} 

private void MyDragSource_MouseMove(object sender, MouseEventArgs e) { 
    if (e.Button == MouseButtons.Left) { 
     if (_DragRect != Rectangle.Empty && !_DragRect.Contains(e.X, e.Y)) { 
     // the mouse has moved outside of the drag-rectangle. Start drag operation 

     MyDragSource.DoDragDrop(.....) 
     } 
    } 
} 

private void MyDragSource_MouseUp(object sender, MouseEventArgs e) { 
    _DragRect = Rectangle.Empty; // reset 
} 
関連する問題