急求大侠关于从ListView拖拽文件到电脑桌面的有关问题,万分感谢
急求大侠关于从ListView拖拽文件到电脑桌面的问题,万分感谢!
我用ListView绑定了我本地的一些图片文件,我想实现从ListView里拖动某一项的图片文件到电脑桌面上,实现将图片文件复制到电脑桌面的功能,我在实现拖动的时候,发现无法拖动文件到电脑桌面上。请教该怎么写啊?
获取本地文件并绑定到ListView
拖动部分代码
------解决思路----------------------
DragDrop.DoDragDrop可以通过合适的 DataObject去做这件事。第一,必须要拷贝文件出来,可以使用临时目录方法System.IO.Path.GetTempPath()进行文件拷贝。下一步创建包含所有文件路径的字符串数组,然后用如下代码:
string[] paths = ...;
DragDrop.DoDragDrop(this, new DataObject(DataFormats.FileDrop, paths),
DragDropEffects.Copy);
实际上就是先实现将ListView中的数据转换成实际文件或者通过ListView找到实际文件,而进行DragDrop的实际上是文件数组。
------解决思路----------------------
lvFiles.DoDragDrop(e.Item, DragDropEffects.Move);
1、不能用Move,按你的描述应该是Copy
2、e.Item是什么我没有看,但你应该从e中获取被拖拽的 文件名(按你的描述该文件在本地已经是存在的),然后构造DataObject对象,想楼上那样 new DataObject(DataFormats.FileDrop, new string[]{ "文件名" }),DoDragDrop的第一个参数就是这样的DataObject对象。
我用ListView绑定了我本地的一些图片文件,我想实现从ListView里拖动某一项的图片文件到电脑桌面上,实现将图片文件复制到电脑桌面的功能,我在实现拖动的时候,发现无法拖动文件到电脑桌面上。请教该怎么写啊?
获取本地文件并绑定到ListView
public static void LoadDirectory(string path, TreeNode node)
{
if (string.IsNullOrEmpty(path) || !Directory.Exists(path))
{
return;
}
string[] directories = Directory.GetDirectories(path, "*", SearchOption.TopDirectoryOnly);
string[] files = Directory.GetFiles(path);
int diretoryLength = directories.Length;
for (int i = 0; i < diretoryLength; i++)
{
node.Nodes.Add(directories[i]);
LoadDirectory(directories[i], node.Nodes[i]);
}
}
public static void LoadFiles(string path, ListView lv,ImageList images)
{
if (string.IsNullOrEmpty(path) || !Directory.Exists(path))
{
return;
}
string[] files = Directory.GetFiles(path);
int index = 0;
lv.Items.Clear();
images.Images.Clear();
foreach (string file in files)
{
string fileName = Path.GetFileName(file);
string filePath = Path.GetDirectoryName(file);
string fileExt = Path.GetExtension(file);
string prefixFileName = Path.GetFileNameWithoutExtension(file);
if (fileExt.Equals(".jpg"))
{
Image image = Image.FromFile(file);
images.Images.Add(image);
ListViewItem listViewItem = new ListViewItem();
listViewItem.Text = fileName;
listViewItem.Tag = filePath + "/" + prefixFileName + ".max";
lv.Items.Add(listViewItem);
lv.Items[index].ImageIndex = index;
index++;
image.Dispose();
LoadFiles(file, lv, images);
}
}
}
private void btnBrowser_Click(object sender, EventArgs e)
{
FolderBrowserDialogEx folderBrowserDialog = new FolderBrowserDialogEx();
folderBrowserDialog.Description = "素材资源所在目录";
folderBrowserDialog.RootFolder = Environment.SpecialFolder.MyComputer;
DialogResult result = folderBrowserDialog.ShowDialog();
if (result == DialogResult.OK)
{
txtDirectory.Text = folderBrowserDialog.SelectedPath;
}
tvDirectory.Nodes.Clear();
tvDirectory.Nodes.Add(new TreeNode("素材目录"));
LoadDirectory(txtDirectory.Text, tvDirectory.Nodes[0]);
}
private void tvDirectory_AfterSelect(object sender, TreeViewEventArgs e)
{
string folder = tvDirectory.SelectedNode.Text;
LoadFiles(folder, lvFiles, imageList1);
}
拖动部分代码
private void lvFiles_ItemDrag(object sender, ItemDragEventArgs e)
{
lvFiles.DoDragDrop(e.Item, DragDropEffects.Move);
}
private void lvFiles_DragDrop(object sender, DragEventArgs e)
{
bool flag = e.Data.GetDataPresent(DataFormats.FileDrop);
if (flag)
{
e.Effect = DragDropEffects.Copy;
}
ListViewItem item = e.Data.GetData(typeof(ListViewItem)) as ListViewItem;
string fileName = item.Text;
string maxFileName = item.Tag.ToString();
}
private void lvFiles_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(ListViewItem)))
{
e.Effect = DragDropEffects.Move;
}
}
------解决思路----------------------
DragDrop.DoDragDrop可以通过合适的 DataObject去做这件事。第一,必须要拷贝文件出来,可以使用临时目录方法System.IO.Path.GetTempPath()进行文件拷贝。下一步创建包含所有文件路径的字符串数组,然后用如下代码:
string[] paths = ...;
DragDrop.DoDragDrop(this, new DataObject(DataFormats.FileDrop, paths),
DragDropEffects.Copy);
实际上就是先实现将ListView中的数据转换成实际文件或者通过ListView找到实际文件,而进行DragDrop的实际上是文件数组。
------解决思路----------------------
lvFiles.DoDragDrop(e.Item, DragDropEffects.Move);
1、不能用Move,按你的描述应该是Copy
2、e.Item是什么我没有看,但你应该从e中获取被拖拽的 文件名(按你的描述该文件在本地已经是存在的),然后构造DataObject对象,想楼上那样 new DataObject(DataFormats.FileDrop, new string[]{ "文件名" }),DoDragDrop的第一个参数就是这样的DataObject对象。