FolderView

C# で TreeView と ListView を並べてフォルダを表示します。

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

プログラムの説明

  1. C# にはウインドウを分割する便利なツール(SplitContainer)が用意されています。
    これを利用してウインドウズ・エクスプローラのように TreeView と ListView を並べてフォルダを表示してみましょう。
    ドライブ情報の取得するので、参照設定を右クリックして、参照の追加から System.Management を追加します。
    事前に "C:\\DATA\\Test\\" に6個のアイコンファイルを格納しておいて下さい。
    アイコン画像の取得と説明は Drive Icon を参照して下さい。
    ファイル名 説明
    FolderView.cs TreeView と ListView を並べてフォルダを表示
  2. FolderView.cs の全ソースコードです。
    /**************************************************************/
    /*★ TreeView と ListView を並べてフォルダを表示    前田 稔 ★*/
    /**************************************************************/
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using System.IO;
    using System.Management;     // 参照の追加 要!
    
    public class MyForm : Form
    {
        private     SplitContainer splitContainer1;
        private     TreeView treeView1;
        private     ListView listView1;
        int[]       width = { 360, 120, 80 };
        string[]    head = { "名前", "更新日付", "サイズ" };
        string      path = "c:\\Test";
        ImageList   imageListSmall = new ImageList();
        string[]    iconFiles =
        { "C:\\DATA\\Test\\null.ico", "C:\\DATA\\Test\\folder.ico",
          "C:\\DATA\\Test\\fdd.ico", "C:\\DATA\\Test\\hdd.ico",
          "C:\\DATA\\Test\\cd.ico", "C:\\DATA\\Test\\remove.ico" };
    
        public MyForm()
        {
            InitializeComponent();
            Load += new System.EventHandler(MyForm_Load);
        }
    
        private void InitializeComponent()
        {
            this.splitContainer1 = new System.Windows.Forms.SplitContainer();
            this.treeView1 = new System.Windows.Forms.TreeView();
            this.listView1 = new System.Windows.Forms.ListView();
            this.splitContainer1.Panel1.SuspendLayout();
            this.splitContainer1.Panel2.SuspendLayout();
            this.splitContainer1.SuspendLayout();
            this.SuspendLayout();
            // 
            // splitContainer1
            // 
            this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.splitContainer1.Location = new System.Drawing.Point(0, 0);
            this.splitContainer1.Name = "splitContainer1";
            // 
            // splitContainer1.Panel1
            // 
            this.splitContainer1.Panel1.Controls.Add(this.treeView1);
            // 
            // splitContainer1.Panel2
            // 
            this.splitContainer1.Panel2.Controls.Add(this.listView1);
            this.splitContainer1.Size = new System.Drawing.Size(598, 245);
            this.splitContainer1.SplitterDistance = 104;
            this.splitContainer1.TabIndex = 0;
            // 
            // treeView1
            // 
            this.treeView1.BackColor = System.Drawing.SystemColors.ControlLightLight;
            this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.treeView1.Location = new System.Drawing.Point(0, 0);
            this.treeView1.Name = "treeView1";
            this.treeView1.Size = new System.Drawing.Size(104, 245);
            this.treeView1.TabIndex = 0;
            // 
            // listView1
            // 
            this.listView1.BackColor = System.Drawing.SystemColors.ControlLight;
            this.listView1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.listView1.FullRowSelect = true;
            this.listView1.GridLines = true;
            this.listView1.Location = new System.Drawing.Point(0, 0);
            this.listView1.Name = "listView1";
            this.listView1.Size = new System.Drawing.Size(490, 245);
            this.listView1.TabIndex = 0;
            this.listView1.UseCompatibleStateImageBehavior = false;
            this.listView1.View = System.Windows.Forms.View.Details;
            // 
            // MyForm
            // 
            this.ClientSize = new System.Drawing.Size(700, 245);
            this.Controls.Add(this.splitContainer1);
            this.Name = "MyForm";
            this.splitContainer1.Panel1.ResumeLayout(false);
            this.splitContainer1.Panel2.ResumeLayout(false);
            this.splitContainer1.ResumeLayout(false);
            this.ResumeLayout(false);
    
        }
    
        // Tree, List にノード(Item)を設定
        private void MyForm_Load(object sender, System.EventArgs e)
        {
            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);
    
            imageListSmall.ImageSize = new Size(16, 16);
            listView1.SmallImageList = imageListSmall;
            treeView1.ImageList = imageListSmall;
    
            listView1.Items.Clear();
            imageListSmall.Images.Clear();
            for (int i = 0; i < iconFiles.GetLength(0); i++)
            { imageListSmall.Images.Add(new Bitmap(iconFiles[i])); }
    
            path= System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
            DirectoryInfo di = new DirectoryInfo(path);     //パスを指定
            string[] item = new string[3];
    
            //List にディレクトリ一覧を登録
            DirectoryInfo[] dis = di.GetDirectories("*.*"); //パターンを指定
            for (int i = 0; i < dis.Length; i++)
            {
                item[0] = dis[i].FullName;
                item[1] = dis[i].LastWriteTime.ToString();
                item[2] = "";
                listView1.Items.Add(new ListViewItem(item));
                listView1.Items[i].ImageIndex = 1;
            }
    
            //List にファイル一覧を登録
            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));
    
                Icon appIcon = System.Drawing.Icon.ExtractAssociatedIcon(fis[i].FullName);
                listView1.Items[listView1.Items.Count-1].ImageIndex = imageListSmall.Images.Count;
                imageListSmall.Images.Add(appIcon);
            }
    
            //Tree にドライブ一覧を登録
            string[] drives = Directory.GetLogicalDrives() ;
            foreach(string drive in drives)
            {
                string drive2 = drive.Substring(0, 2);  // 先頭の2文字を取り出す
                ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid=\"" + drive2 + "\"");
                disk.Get();
                TreeNode tn = new TreeNode(drive2) ;
                if (drive2=="A:")
                    tn.ImageIndex = tn.SelectedImageIndex = 2;
                else  if (disk["DriveType"].ToString()=="3")
                    tn.ImageIndex = tn.SelectedImageIndex = 3;
                else  if (disk["DriveType"].ToString()=="5")
                    tn.ImageIndex = tn.SelectedImageIndex = 4;
                else  if (disk["DriveType"].ToString()=="2")
                    tn.ImageIndex = tn.SelectedImageIndex = 5;
                else
                    tn.ImageIndex = tn.SelectedImageIndex = 1;
                tn.Nodes.Add("dummy");  // +を表示するためにダミーノード追加
                treeView1.Nodes.Add(tn);
            }
        }
    }
    
    class form01
    {
        public static void Main()
        {
            MyForm mf = new MyForm();
            Application.Run(mf);
        }
    }
    
  3. TreeView にはドライブ一覧を検索して、アイコンを設定します。
    Directory.GetLogicalDrives() がドライブを検索するメソッドです。
    ManagementObject() でドライブのタイプを調べます。
    ドライブ=="A:" のときはフロッピーディスクです。
    それ以外のときは disk["DriveType"] でタイプを判定します。
  4. ListView には DesktopDirectory を検索して表示しています。
    Desktop の検索は ListView Directory Icon を参照して下さい。
    Icon.ExtractAssociatedIcon() がファイルに関連付けられているアイコンを取得するメソッドです。
    このメソッドは、.NET Framework version 2.0 で新しく追加されたものです。

[Next Chapter ↓] Handler
[Previous Chapter ↑] SplitContainer

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