Drag&Drop View

ListView には Drag&Drop 専用の機能が備わっています。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. ListView には Drag&Drop 専用の機能が備わっていて、ListBox よりこちらの方がお勧めです。
    簡単なデータを格納して、ドラッグとドロップの機能を設定してみました。
    /*************************************************/
    /*★ 両方の機能を設定した ListView     前田 稔 ★*/
    /*************************************************/
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    public class MyForm : Form
    {
        private ListView listView1;
        private Point mouseDownPoint = Point.Empty;
        static string[] str2 =  { "にんじん", "ごぼう", "レタス", "とまと", "だいこん" };
    
        public MyForm()
        {
            InitializeComponent();
            Load += new System.EventHandler(MyForm_Load);
        }
    
        private void InitializeComponent()
        {
            this.listView1 = new System.Windows.Forms.ListView();
            this.SuspendLayout();
    
            // listView1
            this.listView1.Location = new System.Drawing.Point(12, 12);
            this.listView1.Name = "listView1";
            this.listView1.Size = new System.Drawing.Size(300, 140);
            this.listView1.TabIndex = 0;
            this.listView1.UseCompatibleStateImageBehavior = false;
            this.listView1.AllowDrop = true;
            this.listView1.ItemDrag += new ItemDragEventHandler(ListView1_ItemDrag);
            this.listView1.DragEnter += new DragEventHandler(this.ListView1_DragEnter);
            this.listView1.DragDrop += new DragEventHandler(this.ListView1_DragDrop);
    
            // MyForm
            this.ClientSize = new System.Drawing.Size(320, 160);
            this.Controls.Add(this.listView1);
            this.Name = "MyForm";
            this.ResumeLayout(false);
        }
    
        private void MyForm_Load(object sender, System.EventArgs e)
        {
            for (int i = 0; i < str2.GetLength(0); i++)
            {   listView1.Items.Add(str2[i]);  }
        }
    
        // 選択 Item(e.Item) を Drag する
        private void ListView1_ItemDrag(object sender, ItemDragEventArgs e)
        {
            DragDropEffects dde = listView1.DoDragDrop(e.Item, DragDropEffects.All);
        }
    
        // Drop の開始
        private void ListView1_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(typeof(ListViewItem)))
                e.Effect = DragDropEffects.Copy;
        }
    
        // データを受け取る
        private void ListView1_DragDrop(object sender, DragEventArgs e)
        {
            if (!e.Data.GetDataPresent(typeof(ListViewItem)))   return;
            ListViewItem dropItem = (ListViewItem)e.Data.GetData(typeof(ListViewItem));
    
            // ドラッグされてきた項目を挿入
            ListViewItem insertItem = listView1.Items.Add((ListViewItem)dropItem.Clone());
            insertItem.Selected = true;
        }
    }
    
    class form01
    {
        [STAThread]
        public static void Main()
        {
            MyForm mf = new MyForm();
            Application.Run(mf);
        }
    }
    
  2. ListView1_ItemDrag が ListView 専用のメソッドです。
    ListBox の ListBox1_MouseDown, ListBox1_MouseMove, ListBox1_MouseUp の機能を担ってくれます。
    今回は、Drag&Drop するアイテムは一個だけで e.Item で設定しています。
            this.listView1.ItemDrag += new ItemDragEventHandler(ListView1_ItemDrag);
    
        // 選択 Item(e.Item) を Drag する
        private void ListView1_ItemDrag(object sender, ItemDragEventArgs e)
        {
            DragDropEffects dde = listView1.DoDragDrop(e.Item, DragDropEffects.All);
        }
        
  3. このプログラムを二個同時に起動して、相互に Drag&Drop することが出来ます。
    また一個だけ起動して、自分自身で Drag&Drop することも出来ます。

フォルダ検索で複数選択

  1. フォルダを検索してファイル一覧を ListView に表示します。
    ファイル一覧から複数のアイテムを選択して、Drag&Drop します。
    path = @"C:\TMP"; が一個目のプログラム(DragDropA)のフォルダです。
    path = @"C:\TEST"; が二個目のプログラム(DragDropB)のフォルダです。
    /*********************************************/
    /*★ 複数アイテム選択  ListView    前田 稔 ★*/
    /*********************************************/
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using System.IO;
    using System.Collections.Generic;
    
    public class MyForm : Form
    {
        private ListView    listView1;
        private Point       mouseDownPoint = Point.Empty;
        private int[]       width = { 240, 120, 80 };
        private string[]    head = { "名前", "更新日付", "サイズ" };
        private string      path = @"C:\TMP";
        //private string      path = @"C:\TEST";
    
        public MyForm()
        {
            InitializeComponent();
            InitializeListView();
            Load += new System.EventHandler(MyForm_Load);
        }
    
        private void InitializeComponent()
        {
            this.listView1 = new System.Windows.Forms.ListView();
            this.SuspendLayout();
    
            // listView1
            this.listView1.Location = new System.Drawing.Point(12, 12);
            this.listView1.Name = "listView1";
            this.listView1.Size = new System.Drawing.Size(460, 380);
            this.listView1.TabIndex = 0;
            this.listView1.UseCompatibleStateImageBehavior = false;
            this.listView1.AllowDrop = true;
            this.listView1.ItemDrag += new ItemDragEventHandler(ListView1_ItemDrag);
            this.listView1.DragEnter += new DragEventHandler(this.ListView1_DragEnter);
            this.listView1.DragDrop += new DragEventHandler(this.ListView1_DragDrop);
    
            // MyForm
            this.ClientSize = new System.Drawing.Size(480, 400);
            this.Controls.Add(this.listView1);
            this.Name = "MyForm";
            this.ResumeLayout(false);
        }
    
        // ListViewコントロールを初期化します。
        private void InitializeListView()
        {
            // ListViewコントロールのプロパティを設定
            listView1.FullRowSelect = true;
            listView1.GridLines = true;
            listView1.View = View.Details;
    
            // 列ヘッダの作成
            ColumnHeader[] columnHead = new ColumnHeader[3];
            for (int i=0; i<3; i++)
            {   columnHead[i] = new ColumnHeader();
                columnHead[i].Width = width[i];
                columnHead[i].Text = head[i];
            }
            listView1.Columns.AddRange(columnHead);
        }
    
        // ListViewコントロールのデータを更新します。
        private void MyForm_Load(object sender, System.EventArgs e)
        {
            //DirectoryInfoを作成
            DirectoryInfo di = new DirectoryInfo(path);
            string[] item = new string[3];
    
            //ファイル一覧の取得
            FileInfo [] fis = di.GetFiles("*.*");
            for( int i=0;i<fis.Length;i++)
            {   item[0]= fis[i].FullName;
                item[1]= fis[i].LastWriteTime.ToString();
                item[2]= fis[i].Length.ToString();
                listView1.Items.Add(new ListViewItem(item));
            }
        }
    
        private void ListView1_ItemDrag(object sender, ItemDragEventArgs e)
        {
            List<ListViewItem> selectItems =
                new List<ListViewItem>(listView1.SelectedItems.Count);
            foreach (ListViewItem lvi in listView1.SelectedItems)
                selectItems.Add(lvi);
            DragDropEffects dde = listView1.DoDragDrop(selectItems, DragDropEffects.All);
        }
    
        private void ListView1_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(typeof(List<ListViewItem>)))  e.Effect = DragDropEffects.Copy;
        }
    
        private void ListView1_DragDrop(object sender, DragEventArgs e)
        {
            if (!e.Data.GetDataPresent(typeof(List<ListViewItem>))) return;
            List<ListViewItem> dropItems = (List<ListViewItem>)e.Data.GetData(typeof(List<ListViewItem>));
    
            // ドラッグされてきた項目を挿入
            listView1.SelectedItems.Clear();
            for (int i = dropItems.Count-1; i >= 0; --i)
            {
                ListViewItem insertItem = listView1.Items.Add((ListViewItem)dropItems[i].Clone());
                insertItem.Selected = true;
            }
        }
    }
    
    class form01
    {
        [STAThread]
        public static void Main()
        {
            MyForm mf = new MyForm();
            Application.Run(mf);
        }
    }
    
  2. path = @"C:\TMP"; を設定したプログラム DragDropA.cs と、path = @"C:\TEST"; を設定したプログラム DragDropB.cs を作成して下さい。
    DragDropA と DragDropB を同時に起動して、相互に Drag&Drop します。
    実行に先だって、@"C:\TMP" と @"C:\TEST" に適当なファイルを格納しておいて下さい。
    複数アイテムを選択して Drag&Drop されることを確認して下さい。
    ファイル名が ListView に追加されるだけで、実際にコピーが行われる訳ではありません。
    Copy&Paste や Drag&Drop の標準データ形式は IDataObject ですが、今回は List<T> を使ってみました。
    List<T> の説明は ListGeneric を参照して下さい。

超初心者のプログラム入門(C# Frame Work)