Реализовать перетаскивание файлов на рабочий стол из приложения .net winforms?

У меня есть список файлов с их именами в списке и их содержимом, хранящимся в таблице SQL, и хочу, чтобы пользователь моего приложения мог выбрать один или несколько имен файлов в списке и перетащить их на рабочий стол, давая фактические файлы на рабочем столе. Я не могу найти документацию о том, как это сделать. Может ли кто-нибудь объяснить или указать на объяснение?

Добавлено позже: Я смог выполнить эту работу, обработав событие 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);

Но это кажется очень неэффективным и неуклюжим, и я еще не понял хороший способ избавиться от накопленных файлов temp.

Ответ 1

Я могу вам помочь. Вот какой-то код, который позволит вам вытащить что-то из списка, а когда он упадет на рабочий стол, он создаст копию файла, который существует на вашем компьютере, на рабочий стол.

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);
    }
}

Ответ 2

Вот некоторые из табличек котла, которые помогут вам определить, когда начать перетаскивание:

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
}