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


| 
/*************************************************/
/*★ Handler Tree & List の基本設定    前田 稔 ★*/
/*************************************************/
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 = { 320, 120, 80, 40 };
    string[]    head = { "名前", "更新日付", "サイズ", "種類" };
    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 string   Sel_Dir = "";
    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(764, 400);
        this.splitContainer1.SplitterDistance = 195;
        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(195, 400);
        this.treeView1.TabIndex = 0;
        this.treeView1.BeforeExpand +=
            new System.Windows.Forms.TreeViewCancelEventHandler(this.treeView1_BeforeExpand);
        this.treeView1.AfterSelect +=
            new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);
        // 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(565, 400);
        this.listView1.TabIndex = 0;
        this.listView1.UseCompatibleStateImageBehavior = false;
        this.listView1.View = System.Windows.Forms.View.Details;
        // MyForm
        this.ClientSize = new System.Drawing.Size(764, 400);
        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);
    }
    // アプリケーションの初期化
    private void MyForm_Load(object sender, System.EventArgs e)
    {
        //List View にカラムを設定
        ColumnHeader[] columnHead = new ColumnHeader[width.GetLength(0)];
        for (int i=0; i<width.GetLength(0); i++)
        {   columnHead[i] = new ColumnHeader();
            columnHead[i].Width = width[i];
            columnHead[i].Text = head[i];
        }
        listView1.Columns.AddRange(columnHead);
        //ImageList の作成
        imageListSmall.ImageSize = new Size(16, 16);
        listView1.SmallImageList = imageListSmall;
        treeView1.ImageList = imageListSmall;
        imageListSmall.Images.Clear();
        for (int i = 0; i < iconFiles.GetLength(0); i++)
        { imageListSmall.Images.Add(new Bitmap(iconFiles[i])); }
        //Tree にマイコンピュータとドライブ一覧を登録
        treeView1.Nodes.Clear();
        TreeNodeEx tne = new TreeNodeEx("マイ コンピュータ");
        string[] drives = Directory.GetLogicalDrives();
        foreach (string drive in drives) 
        {
            string drive2 = drive.Substring(0, 2);  // 先頭2文字(C:)
            ManagementObject disk =
                new ManagementObject("win32_logicaldisk.deviceid=\"" + drive2 + "\"");
            disk.Get();
            TreeNodeEx tn = new TreeNodeEx(drive);
            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;
            tne.Nodes.Add(tn);
        }
        tne.SubFoldersAdded = true;
        treeView1.Nodes.Add(tne);
        treeView1.TopNode.Expand();
    }
    // List View にノード(Item)を設定
    private void SetList(string path)
    {
        if (!Directory.Exists(path))    // ディレクトリが存在しない
        {   MessageBox.Show(path + " にメディアを挿入してください。");
            return;
        }
        listView1.Items.Clear();
        DirectoryInfo di = new DirectoryInfo(path);     //パスを指定
        string[] item = new string[4];
        try
        {
            //ディレクトリ一覧の取得
            DirectoryInfo[] dis = di.GetDirectories("*.*"); //パターンを指定
            for (int i = 0; i < dis.Length; i++)
            {   item[0] = dis[i].Name;
                item[1] = dis[i].LastWriteTime.ToString();
                item[2] = "";
                item[3] = "";
                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].Name;
                item[1] = fis[i].LastWriteTime.ToString();
                item[2] = fis[i].Length.ToString();
                item[3] = fis[i].Extension;
                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);
            }
        }
        catch(Exception)
        {   Console.WriteLine("アクセス権 or ERROR: " + path);  }
    }
    // SubFoldersAdded == false のノードを展開
    // 1つ下の階層のすべてのノードに対して、子ノードが追加済みでない場合それを追加します。
    private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
    {
        TreeNodeEx node = (TreeNodeEx)e.Node;
        foreach (TreeNodeEx child in node.Nodes)
        {
            if (child.SubFoldersAdded == false)
            {
                string path = GetPathFromNode(child);
                try
                {
                    DirectoryInfo di = new DirectoryInfo(path);
                    if(di.Exists)
                    {
                        DirectoryInfo[] dirs = di.GetDirectories();
                        foreach (DirectoryInfo dir in dirs) 
                        {
                            TreeNodeEx nd = new TreeNodeEx(dir.Name);
                            nd.ImageIndex         = 1 ;     // 閉じたフォルダアイコン
                            nd.SelectedImageIndex = 1 ;     // 開いたフォルダアイコン
                            child.Nodes.Add(nd);
                        }
                        child.SubFoldersAdded = true;
                    }
                }
                catch(Exception)
                {   }
            }
        } 
    } 
    // Tree View の選択が変更された時の処理
    private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
    {
        if (Sel_Dir==string.Empty)
            Sel_Dir = System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
        else    Sel_Dir = GetPathFromNode(e.Node);
        SetList(Sel_Dir);
        if (listView1.Items.Count >= 1)     //ListView に focus する
        {   listView1.Items[0].Selected = true ;
            listView1.Items[0].Focused  = true ;
        }
    }
    // ノードからパスを取得します。
    private string GetPathFromNode(TreeNode node)
    {
        if (node.Parent == null)
        {   return node.Text;   }
        return Path.Combine(GetPathFromNode(node.Parent), node.Text);
    }
}
// サブフォルダーフラグを使った TreeNodeEx
public class TreeNodeEx : System.Windows.Forms.TreeNode
{
    private bool isSubFoldersAdded;
    public TreeNodeEx(string text) : base(text)
    {   InitializeComponent();  }
    private void InitializeComponent()
    {   isSubFoldersAdded = false;  }
    public bool SubFoldersAdded
    {
        get
        {   return isSubFoldersAdded;   }
        set
        {   isSubFoldersAdded = value;  }
    }
} 
class form01
{
    public static void Main()
    {
        MyForm mf = new MyForm();
        Application.Run(mf);
    }
}
 | 


[Next Chapter ↓] File Handler
[Previous Chapter ↑] FolderView