Реализовать перетаскивание файлов на рабочий стол из приложения .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
}
Ответ 3
Я нашел лучшее решение, расширив System.Windows.Forms.DataObject
Перенос виртуальных файлов в проводник Windows на С#
также нашел некоторые темы здесь, на StackOverFlow, которые могут помочь
Перетащите большие виртуальные файлы из С# в проводник Windows