前田稔(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