Реализовать перетаскивание файлов на рабочий стол из приложения .net winforms? - PullRequest
12 голосов
/ 17 июня 2009

У меня есть список файлов с их именами в списке и их содержимое, сохраненное в таблице 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);

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

Ответы [ 3 ]

11 голосов
/ 17 июня 2009

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

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);
    }
}
4 голосов
/ 17 июня 2009

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

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
}
3 голосов
/ 02 января 2015

Я нашел лучшее решение, расширив System.Windows.Forms.DataObject
Передача виртуальных файлов в Проводник Windows в C #

также нашел некоторые темы здесь на StackOverFlow, которые могут помочь
Перетаскивание больших виртуальных файлов из C # в Проводник Windows

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...