我有一个文件列表,其列表框中包含其名称,其内容存储在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);
但这看起来非常低效且笨拙,我还没有找到摆脱累积临时文件的好方法。
答案 0 :(得分:11)
我可以帮到你一些。这里有一些代码可以让你从列表框中拖出一些东西,当它放在桌面上时,它会创建一个存在于你机器上的文件副本到桌面。
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);
}
}
答案 1 :(得分:4)
这里有一些锅炉板可以帮助您确定何时开始拖动操作:
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
}
答案 2 :(得分:3)
我通过扩展System.Windows.Forms.DataObject
来找到了更好的解决方案
Transferring Virtual Files to Windows Explorer in C#
还在StackOverFlow上找到了一些可能有用的线程 Drag and drop large virtual files from C# to Windows Explorer