The following code will enable dragging ListView items and dropping in Explorer to generate files. Temporary files will be generated and deferred rendering will be used...
 
using System;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

using System.IO;

 

namespace WinFormDragNDropExplorer

{

     /// <summary>

     /// Summary description for Form1.

     /// </summary>

     public class Form1 : System.Windows.Forms.Form

     {

         private System.Windows.Forms.ListView listView1;

         /// <summary>

         /// Required designer variable.

         /// </summary>

         private System.ComponentModel.Container components = null;

 

         public Form1()

         {

              //

              // Required for Windows Form Designer support

              //

              InitializeComponent();

 

              //

              // TODO: Add any constructor code after InitializeComponent call

              //

         }

 

         /// <summary>

         /// Clean up any resources being used.

         /// </summary>

         protected override void Dispose( bool disposing )

         {

              if( disposing )

              {

                   if (components != null)

                   {

                       components.Dispose();

                   }

              }

              base.Dispose( disposing );

         }

 

         #region Windows Form Designer generated code

         /// <summary>

         /// Required method for Designer support - do not modify

         /// the contents of this method with the code editor.

         /// </summary>

         private void InitializeComponent()

         {

              System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem("Item 1");

              System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem("Item 2");

              System.Windows.Forms.ListViewItem listViewItem3 = new System.Windows.Forms.ListViewItem("Item 3");

              this.listView1 = new System.Windows.Forms.ListView();

              this.SuspendLayout();

              //

              // listView1

              //

              this.listView1.Items.AddRange(new System.Windows.Forms.ListViewItem[] {

                                                                                                    listViewItem1,

                                                                                                    listViewItem2,

                                                                                                    listViewItem3});

              this.listView1.Location = new System.Drawing.Point(40, 24);

              this.listView1.Name = "listView1";

              this.listView1.Size = new System.Drawing.Size(384, 280);

              this.listView1.TabIndex = 0;

              this.listView1.QueryContinueDrag += new System.Windows.Forms.QueryContinueDragEventHandler(this.listView1_QueryContinueDrag);

              this.listView1.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.listView1_ItemDrag);

              //

              // Form1

              //

              this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);

              this.ClientSize = new System.Drawing.Size(472, 333);

              this.Controls.Add(this.listView1);

              this.Name = "Form1";

              this.Text = "Form1";

              this.ResumeLayout(false);

 

         }

         #endregion

 

         /// <summary>

         /// The main entry point for the application.

         /// </summary>

         [STAThread]

         static void Main()

         {

              Application.Run(new Form1());

         }

 

         private ShellDataObject dataObj = null;

 

         private void listView1_QueryContinueDrag(object sender, System.Windows.Forms.QueryContinueDragEventArgs e)

         {

              //ESC pressed

              if (e.EscapePressed)

              {

                   e.Action = DragAction.Cancel;

                   return;

              }

              //Drop!

              if (e.KeyState == 0)

              {

                   dataObj.SetData(ShellClipboardFormats.CFSTR_INDRAGLOOP, 0);

                   e.Action = DragAction.Drop;

                   return;

              }

              e.Action = DragAction.Continue;

         }

 

 

         private void listView1_ItemDrag(object sender, System.Windows.Forms.ItemDragEventArgs e)

         {

              String[] fileNames;

              //Create the data object used for the drag drop operation

              dataObj = new ShellDataObject();

              //Create an array of strings to hold the filename(s)

              fileNames = new String[listView1.SelectedItems.Count];

              //Create temporary files that the user can drag.

              for (int i = 0; i < listView1.SelectedItems.Count; i++)

              {

                   fileNames[i] = CreateTemporaryFileName(listView1.SelectedItems[i].Text + ".txt");

              }

              //Add the list of files to the data object

              dataObj.SetData(DataFormats.FileDrop, fileNames);

              //Set the preferred drop effect

              dataObj.SetData(ShellClipboardFormats.CFSTR_PREFERREDDROPEFFECT, DragDropEffects.Move);

              //Indicate that we are in a drag loop

              dataObj.SetData(ShellClipboardFormats.CFSTR_INDRAGLOOP, 1);

              //Initiate the drag operation

              listView1.DoDragDrop(dataObj, DragDropEffects.Move | DragDropEffects.Copy);

              //Free the data object

              dataObj = null;

         }

 

         private String CreateTemporaryFileName(String name)

         {

              String path;

              String fileName;

              System.IO.StreamWriter file;

              //Build a path for the temporary file

              path = System.IO.Path.GetTempPath();

              fileName = System.IO.Path.Combine(path, name);

              //Create the temporary file to make sure it exists

              file = new System.IO.StreamWriter(fileName);

              file.Close();

              return fileName;

         }

     }

 

     //Constant declarations. Please refer to "shlobj.h"

     public class ShellClipboardFormats

     {

         public const string CFSTR_SHELLIDLIST = "Shell IDList Array";

         public const string CFSTR_SHELLIDLISTOFFSET = "Shell Object Offsets";

         public const string CFSTR_NETRESOURCES = "Net Resource";

         public const string CFSTR_FILEDESCRIPTORA = "FileGroupDescriptor";

         public const string CFSTR_FILEDESCRIPTORW = "FileGroupDescriptorW";

         public const string CFSTR_FILECONTENTS = "FileContents";

         public const string CFSTR_FILENAMEA = "FileName";

         public const string CFSTR_FILENAMEW = "FileNameW";

         public const string CFSTR_PRINTERGROUP = "PrinterFreindlyName";

         public const string CFSTR_FILENAMEMAPA = "FileNameMap";

         public const string CFSTR_FILENAMEMAPW = "FileNameMapW";

         public const string CFSTR_SHELLURL = "UniformResourceLocator";

         public const string CFSTR_INETURLA = CFSTR_SHELLURL;

         public const string CFSTR_INETURLW = "UniformResourceLocatorW";

         public const string CFSTR_PREFERREDDROPEFFECT = "Preferred DropEffect";

         public const string CFSTR_PERFORMEDDROPEFFECT = "Performed DropEffect";

         public const string CFSTR_PASTESUCCEEDED = "Paste Succeeded";

         public const string CFSTR_INDRAGLOOP = "InShellDragLoop";

         public const string CFSTR_DRAGCONTEXT = "DragContext";

         public const string CFSTR_MOUNTEDVOLUME = "MountedVolume";

         public const string CFSTR_PERSISTEDDATAOBJECT = "PersistedDataObject";

         public const string CFSTR_TARGETCLSID = "TargetCLSID";

         public const string CFSTR_LOGICALPERFORMEDDROPEFFECT = "Logical Performed DropEffect";

         public const string CFSTR_AUTOPLAY_SHELLIDLISTS = "Autoplay Enumerated IDList Array";

     }

 

     public class ShellDataObject: DataObject

     {

         //This flag is used to prevent multiple callings to "GetData" when dropping in Explorer.

         private bool downloaded = false;

         public override object GetData(String format)

         {

              Object obj = base.GetData(format);

              if (System.Windows.Forms.DataFormats.FileDrop == format &&

                   !InDragLoop() && !downloaded)

              {

                   int i;

                   String[] files = (String[])obj;

                   for (i = 0; i < files.Length; i++)

                   {

                       DownloadFile(files[i]);

                   }

                   downloaded = true;

              }

              return obj;

         }

 

         private void DownloadFile(String filename)

         {

              StreamWriter file;

              // Create the temporary file and its data

              file = new StreamWriter(filename);

              file.WriteLine(filename);

              file.Close();

         }

 

         private bool InDragLoop()

         {

              return (0 != (int)GetData(ShellClipboardFormats.CFSTR_INDRAGLOOP));

         }

     }

}