DOBON.NET DOBON.NETプログラミング掲示板過去ログ

リストビューへのドロップ

環境/言語:[WinXP/VC#2005Express]
分類:[.NET]

2008/03/07(Fri) 17:14:09 編集(投稿者)

ファイルをリストビューへドラッグ&ドロップして、ファイル名、ファイルの場所、ファイルのサイズをリストビューで表示するようにしたいのですがどうしていいのかわかりません。

どのような処理すれば良いでしょうか?
現在は下記のような状態です。

private void ListView1_DragEnter(object sender, DragEventArgs e)
{
   if (e.Data.GetDataPresent(DataFormats.FileDrop))
   e.Effect = DragDropEffects.Copy;
   else
   e.Effect = DragDropEffects.None;
}

private void ListView1_DragDrop(object sender, DragEventArgs e)
{
string[] filename
= (string[])e.Data.GetData(DataFormats.FileDrop, false);

ListView1.Items.Add(new ListViewItem(new string[] { filename }));
}
System.IO.FileInfo クラスを使って各種情報を取得します。

// 何が分からないのか分かりませんのでこれくらいしか答えられません。
> System.IO.FileInfo クラスを使って各種情報を取得します。
>
> // 何が分からないのか分かりませんのでこれくらいしか答えられません。

すみません。
知りたいのは各種情報の取得の方法ではなく、
ドロップしたファイルの情報をリストビューに表示する方法が知りたいのです。
■No21603に返信(ぽぽさんの記事)
> ドロップしたファイルの情報をリストビューに表示する方法が知りたいのです。

ご自分で書かれています。
ListView1.Items.Add(new ListViewItem(new string[] { filename }));
指定している文字列配列はヘッダの順序に対応しているということでいいのかな?
#詳細ビューですよね?
■No21604に返信(まどかさんの記事)
> ご自分で書かれています。
> ListView1.Items.Add(new ListViewItem(new string[] { filename }));
> 指定している文字列配列はヘッダの順序に対応しているということでいいのかな?
> #詳細ビューですよね?

この方法でやってみたのですが、
string[]をstringに暗黙的に変換できませんとエラーが出ます。

詳細ビューというのがわからないのですが、リストのビューはDetailsです。
2008/03/10(Mon) 22:06:44 編集(投稿者)

はじめまして、引っ込んだ略と申します。
 以下のコードで試してみてください。
 
 [ここから投稿末尾まで内容を差し替え]
 コードをバージョンアップしたため、コードを全て差し替えました。
 
    using System.IO;
 
    public class Form2_2:Form
    {
 
        private ListView listView1 = new ListView();
        
        public Form2_2()
        {
            this.Text = this.GetType().Name;
            this.Size = new Size(450, 300);
            this.listView1.DragEnter += new DragEventHandler(this.ListView1_DragEnter);
            this.listView1.DragDrop += new DragEventHandler(this.ListView1_DragDrop);
            Application.Idle+=new EventHandler(this.Application_Idle);
            this.listView1.AllowDrop = true;
            this.listView1.Columns.Add("ファイル名");
            this.listView1.Columns.Add("パス名");
            this.listView1.Columns.Add("ファイルサイズ");
            this.listView1.Dock = DockStyle.Fill;
            this.listView1.View = View.Details;
            this.listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
            this.Controls.Add(listView1);
            DriveInfo di=new DriveInfo("J:\\");
        }
 
        private enum DroppedType
        {
            None, File, Folder, ReadyDrive, NotReadyDrive
        }
        // コンテナの定義
        private class MyData
        {
            public DroppedType flag;
            public string filename;
            public MyData(DroppedType flg,string name)
            {
                this.flag=flg;
                this.filename=name;
            }
        }
        private Queue<MyData> _myqueue = new Queue<MyData>();
 
        // ここで詳細情報取得とListViewへのItem追加を行う。
        private void Application_Idle(object sender, EventArgs e)
        {
            this.DoTask();
        }
 
        private void DoTask() 
        {
            while (_myqueue.Count >= 1)
            {
                MyData md = _myqueue.Dequeue();
                switch (md.flag)
                {
                    case DroppedType.File: { this.OnDroppedFile(md.filename); break; }
                    case DroppedType.Folder: { this.OnDroppedFolder(md.filename); break; }
                    case DroppedType.ReadyDrive: { this.OnDroppedReadyDrive(md.filename);
                        break; }
                    case DroppedType.NotReadyDrive: { this.OnDroppedNotReadyDrive(md.filename);
                        break; }
                }
            }
        }
 
        private void ListView1_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop, false))
                e.Effect = DragDropEffects.Copy;
            else
                e.Effect = DragDropEffects.None;
        }
 
        private void ListView1_DragDrop(object sender, DragEventArgs e)
        {
            object o = e.Data.GetData(DataFormats.FileDrop,false);
            if (o == null) { return; } 

            string[] ssa = o as string[];

            if (ssa == null){return;}
            if (ssa.Length <= 0) { return; }
 
            // 複数個のアイコンを一度にDropした場合に対応
            foreach (string filename in ssa)
            {
                // Dropしたfilenameの種類を判断
                // ※ とりあえずQueueにファイル名を格納しておき、
                // ※ Appication_Idleイベントハンドラ内でその後の処理を行う。
                if (File.Exists(filename) == true)
                {
                    // ファイルをDropした
                    _myqueue.Enqueue(new MyData(DroppedType.File, filename));
                }
                else if (Path.GetPathRoot(filename) == filename)
                {
                    DriveInfo dri = new DriveInfo(filename);

                    if (dri.IsReady == true)
                    {
                        // DriveアイコンをDropした
                        _myqueue.Enqueue(new MyData(DroppedType.ReadyDrive, filename));
                    }
                    else
                    {
                        // 準備のできていないDriveのアイコンをDropした
                        _myqueue.Enqueue(new MyData(DroppedType.NotReadyDrive, filename));
                    }
                }
                else if (Directory.Exists(filename) == true)
                {
                    // フォルダをDropした
                    _myqueue.Enqueue(new MyData(DroppedType.Folder, filename));
                }
            }
        }
 
        // 詳細情報を取得してListViewに表示
        private void OnDroppedFile(string name)
        {
            FileInfo fi = new FileInfo(name);
            long filesize = fi.Length;
            string[] ssb = new string[] { Path.GetFileName(name), 
                Path.GetDirectoryName(name), String.Format("{0} バイト", filesize) };
            listView1.Items.Add(new ListViewItem(ssb));
            this.listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
        }
        private void OnDroppedFolder(string name)
        {
            DirectoryInfo di = new DirectoryInfo(name);
            string[] ssb = new string[] { "(ディレクトリ)", name, "(サイズは省略)" };
            listView1.Items.Add(new ListViewItem(ssb));
            this.listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
        }
        private void OnDroppedReadyDrive(string name)
        {
            DriveInfo dri = new DriveInfo(name);
            DirectoryInfo di = new DirectoryInfo(name);
            long freespace = dri.TotalFreeSpace;
            string[] ssb = new string[] { "(ドライブ)", 
                name, string.Format("空き領域は {0} バイト",freespace)};
            listView1.Items.Add(new ListViewItem(ssb));
            this.listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
        }
        private void OnDroppedNotReadyDrive(string name)
        {
            string[] ssb = new string[] { "(ドライブの準備ができていません)", 
                name, "(サイズは省略)" };
            listView1.Items.Add(new ListViewItem(ssb));
            this.listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
        }
    }
以上です。
■No21616に返信(引っ込んだ略さんの記事)
> 2008/03/10(Mon) 01:16:27 編集(投稿者)
>
> はじめまして、引っ込んだ略と申します。
>  以下のコードで試してみてください。

はじめまして!!
詳細ありがとうございました。
すごく助かりました^^
まだ試していないのですが、ここで解決とさせていただきます。

Hongliangさん、まどかさん、引っ込んだ略さんありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板