Csharp/CSharp Tutorial/GUI Windows Forms/File Explore

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

A File Explore Clone

<source lang="csharp">/* Quote from Programming .NET Windows Applications By Jesse Liberty, Dan Hurwitz First Edition October 2003 Pages: 1246 (More details)

  • /

using System; using System.Drawing; using System.Collections; using System.ruponentModel; using System.Windows.Forms; using System.Data; using System.IO; using System.Diagnostics; // for Process.Start namespace csExplorerClone {

 public class Form1 : System.Windows.Forms.Form
 {
   private System.Windows.Forms.Splitter splitter1;
   private System.Windows.Forms.ListView lv;
   private System.Windows.Forms.TreeView tvw;
   private System.Windows.Forms.MainMenu mainMenu1;
   private System.Windows.Forms.MenuItem menuItem1;
   private System.Windows.Forms.MenuItem mnuSmallIcons;
   private System.Windows.Forms.MenuItem mnuLargeIcons;
   private System.Windows.Forms.MenuItem mnuList;
   private System.Windows.Forms.MenuItem mnuDetails;
   
   public enum ColumnType
   {
     Alpha,
     Numeric,
     DateTimeValue
   }
   /// <summary>
   /// Required designer variable.
   /// </summary>
   private System.ruponentModel.Container components = null;
   public Form1()
   {
     InitializeComponent();
     //  Similar to TreeViews program
     //  Use an array to add filenames to the ImageLists
     String[] arFiles = {
       @"C:\Program Files\Microsoft Visual Studio .NET\Common7\" + 
               @"Graphics\icons\computer\form.ico",
       @"C:\Program Files\Microsoft Visual Studio .NET\Common7\" + 
               @"Graphics\icons\win95\clsdfold.ico", 
       @"C:\Program Files\Microsoft Visual Studio .NET\Common7\" + 
               @"Graphics\icons\win95\openfold.ico", 
       @"C:\Program Files\Microsoft Visual Studio .NET\Common7\" + 
               @"Graphics\bitmaps\assorted\happy.bmp",
       @"C:\Program Files\Microsoft Visual Studio .NET\Common7\" + 
               @"Graphics\bitmaps\outline\NoMask\doc.bmp",
       @"C:\Program Files\Microsoft Visual Studio .NET\Common7\" + 
               @"Graphics\bitmaps\outline\NoMask\exe.bmp",
       @"C:\Program Files\Microsoft Visual Studio .NET\Common7\" + 
               @"Graphics\bitmaps\outline\NoMask\txt.bmp",
       @"C:\Program Files\Microsoft Visual Studio .NET\Common7\" + 
               @"Graphics\bitmaps\outline\NoMask\windoc.bmp"
       };
     ImageList imgListSmall = new ImageList();  //  default size 16x16
     ImageList imgListLarge = new ImageList();
     imgListLarge.ImageSize = new Size(32,32);
     for (int i = 0; i < arFiles.Length; i++)
     {
       imgListSmall.Images.Add(Image.FromFile(arFiles[i]));    
       imgListLarge.Images.Add(Image.FromFile(arFiles[i]));    
     }
     tvw.Size = new Size(ClientSize.Width / 3, ClientSize.Height);
     tvw.BackColor = Color.Moccasin;
     tvw.HideSelection = false;  
     tvw.ImageList = imgListSmall;
     tvw.ImageIndex = 1;
     tvw.SelectedImageIndex = 2;
     //  End similar to TreeViews program
     lv.BackColor = Color.PaleTurquoise;
     lv.ForeColor = Color.DarkBlue;
     lv.HideSelection = false;
     lv.SmallImageList = imgListSmall;
     lv.LargeImageList = imgListLarge;
     lv.View = View.SmallIcon;
     lv.Activation = ItemActivation.Standard;  // default
     lv.MultiSelect = true;      // default
     lv.HoverSelection = false;    // default
     lv.Sorting = SortOrder.None;  // default
     lv.AllowColumnReorder = true;
     lv.FullRowSelect = true;
     lv.GridLines = true;
     lv.HeaderStyle = ColumnHeaderStyle.Clickable;    // default
     lv.LabelEdit = true;
     
     //  Similar to TreeViews program
     //  Fill the directory tree
     FillDirectoryTree();
   }
   //  These 3 methods essentially same as in TreeViews program
   private void FillDirectoryTree()
   {
     //  Populate with the contents of the local hard drive.
     //  Suppress redraw until tree view is complete
     tvw.BeginUpdate();
          //  First clear all the nodes.
     tvw.Nodes.Clear();
     //  Get the logical drives and put them into the root nodes.
     //  Fill an array with all the logical drives on the machine.
     string[] strDrives = Environment.GetLogicalDrives();
     //  Iterate through the drives, adding them to the tree.
     //  Use a try/catch block, so if a drive is not ready, 
     //  e.g. an empty floppy or CD, it will not be added to the tree.
           foreach (string rootDirectoryName in strDrives)
          {
       try 
       {
         //  Find all the first level subdirectories.
         //  If the drive is not ready, this will throw an 
         //  exception, which will have the effect of 
         //  skipping that drive.
         Directory.GetDirectories(rootDirectoryName);
         //  Create a node for each root directory
         TreeNode ndRoot = new TreeNode(rootDirectoryName);
         //  Add the node to the tree
         tvw.Nodes.Add(ndRoot);

         //  Set colors based on Index property.
          //  Index not set until after node added to collection.
         if (ndRoot.Index % 2 == 0)
         {
           ndRoot.BackColor = Color.LightYellow;
           ndRoot.ForeColor = Color.Green;
         }
         //  Add subdirectory nodes.
         //  Hard code getFileNames to false.
         GetSubDirectoryNodes(ndRoot, false);
       }
       catch  (System.IO.IOException)
       {
         //  let it through
             }
       catch  (Exception e)
       {
               //  Catch any other errors.
         MessageBox.Show(e.Message);
             }
     }
        
         tvw.EndUpdate();
        
   }      //  close FillDirectoryTree
   private void GetSubDirectoryNodes(TreeNode parentNode, 
                         bool getFileNames)
   {
     //  Exit this method if the node is not a directory.
     DirectoryInfo di = new DirectoryInfo(parentNode.FullPath);
     if ((di.Attributes & FileAttributes.Directory) == 0)
     {
       return;
     }
          //  Clear all the nodes in this node.
     parentNode.Nodes.Clear();
     //  Get an array of strings containing all the subdirectories in the parent node.
     string[] arSubs = Directory.GetDirectories(parentNode.FullPath);
     //  Add a child node for each subdirectory.
     foreach (string subDir in arSubs)
     {
             DirectoryInfo dirInfo = new DirectoryInfo(subDir);
             // do not show hidden folders
             if ((dirInfo.Attributes & FileAttributes.Hidden)!= 0)
             {
                continue;
             }
       TreeNode subNode = new TreeNode(dirInfo.Name);
       parentNode.Nodes.Add(subNode);
           
       //  Set colors based on Index property.
       if (subNode.Index % 2 == 0)
         subNode.BackColor = Color.LightPink;
     }

// This section of code is never called in this program. Vestigial from TreeViews.cs // if (getFileNames) // { // // Get any files for this node. // string[] files = Directory.GetFiles(parentNode.FullPath); // // // After placing the nodes, // // now place the files in that subdirectory. // foreach (string str in files) // { // FileInfo fi = new FileInfo(str); // TreeNode fileNode = new TreeNode(fi.Name); // parentNode.Nodes.Add(fileNode); // // // Set the icon // fileNode.ImageIndex = 0; // fileNode.SelectedImageIndex = 3; // // // Set colors based on Index property. // if (fileNode.Index % 2 == 0) // fileNode.BackColor = Color.LightGreen; // } // }

   }  // close GetSubDirectoryNodes
   private void tvw_BeforeExpand(object sender, 
                 TreeViewCancelEventArgs e)
   {
     tvw.BeginUpdate();
     foreach (TreeNode tn in e.Node.Nodes)
     {
       GetSubDirectoryNodes(tn, false);
     }
     tvw.EndUpdate();      
   }    
   
   // This populates the list view after a tree node is selected
   private void tvw_AfterSelect(object sender, 
                 TreeViewEventArgs e)
   {
     lv.Clear();
     lv.BeginUpdate();
     
     DirectoryInfo di = new DirectoryInfo(e.Node.FullPath);
     FileSystemInfo[] afsi = di.GetFileSystemInfos();
     foreach (FileSystemInfo fsi in afsi)
     {
       ListViewItem lvi = new ListViewItem(fsi.Name);
       
       if ((fsi.Attributes & FileAttributes.Directory) != 0)
       {
         lvi.ImageIndex = 1;
         lvi.SubItems.Add("");      // Bytes subitem
       }
       else
       {
         switch(fsi.Extension.ToUpper())
         {
           case ".DOC" :
             lvi.ImageIndex = 4;
             break;
           case ".EXE" :
             lvi.ImageIndex = 5;
             break;
           case ".TXT" :
             lvi.ImageIndex = 6;
             break;
           default :
             lvi.ImageIndex = 7;
             break;
         }
         //  Bytes subitem, w/ commas
         //  Cast FileSystemInfo object to FileInfo object so the 
         //    size can be obtained.
         lvi.SubItems.Add(((FileInfo)fsi).Length.ToString("N0"));
       }
       //  Add the remaining subitems to the ListViewItem
       lvi.SubItems.Add(fsi.Extension);            // type
       lvi.SubItems.Add(fsi.LastWriteTime.ToString());  // modified
       //  Build up the Attributes string
       string strAtt = "";
       if ((fsi.Attributes & FileAttributes.ReadOnly) != 0)
         strAtt += "R";
       if ((fsi.Attributes & FileAttributes.Hidden) != 0)
         strAtt += "H";
       if ((fsi.Attributes & FileAttributes.System) != 0)
         strAtt += "S";
       if ((fsi.Attributes & FileAttributes.Archive) != 0)
         strAtt += "A";
       lvi.SubItems.Add(strAtt);        // attributes
       lv.Items.Add(lvi);
     }  //  end foreach
     
     lv.Columns.Add("Name", 150, HorizontalAlignment.Left);
     lv.Columns.Add("Bytes", 75, HorizontalAlignment.Right);
     lv.Columns.Add("Ext.", 50, HorizontalAlignment.Left);
     lv.Columns.Add("Modified", 125, HorizontalAlignment.Left);
     lv.Columns.Add("Attrib.", 50, HorizontalAlignment.Left);
     
     lv.EndUpdate();
   }                //  close tvw_AfterSelect
   
   private void mnuView_Click(object sender, EventArgs e)
   {
     MenuItem mnu = (MenuItem)sender;
     switch (mnu.Mnemonic.ToString())
     {
       case "L"  :    //  Large Icons  
         lv.View = View.LargeIcon;
         break;
       case "S"  :    //  Small Icons
         lv.View = View.SmallIcon;
         break;
       case "T" :    //  List view
         lv.View = View.List;
         break;
       case "D" :    //  Detail view
         lv.View = View.Details;
         break;
     }
   }
   protected override void Dispose( bool disposing )
   {
     if( disposing )
     {
       if (components != null) 
       {
         components.Dispose();
       }
     }
     base.Dispose( disposing );
   }
   #region Windows Form Designer generated code
   /// <summary>
   /// Required method for Designer support - do not modify
   /// the contents of this method with the code editor.
   /// </summary>
   private void InitializeComponent()
   {
     this.tvw = new System.Windows.Forms.TreeView();
     this.splitter1 = new System.Windows.Forms.Splitter();
     this.lv = new System.Windows.Forms.ListView();
     this.mainMenu1 = new System.Windows.Forms.MainMenu();
     this.menuItem1 = new System.Windows.Forms.MenuItem();
     this.mnuSmallIcons = new System.Windows.Forms.MenuItem();
     this.mnuLargeIcons = new System.Windows.Forms.MenuItem();
     this.mnuList = new System.Windows.Forms.MenuItem();
     this.mnuDetails = new System.Windows.Forms.MenuItem();
     this.SuspendLayout();
     // 
     // tvw
     // 
     this.tvw.Dock = System.Windows.Forms.DockStyle.Left;
     this.tvw.ImageIndex = -1;
     this.tvw.Name = "tvw";
     this.tvw.SelectedImageIndex = -1;
     this.tvw.Size = new System.Drawing.Size(168, 600);
     this.tvw.TabIndex = 0;
     this.tvw.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tvw_AfterSelect);
     this.tvw.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.tvw_BeforeExpand);
     // 
     // splitter1
     // 
     this.splitter1.Location = new System.Drawing.Point(168, 0);
     this.splitter1.Name = "splitter1";
     this.splitter1.Size = new System.Drawing.Size(3, 600);
     this.splitter1.TabIndex = 1;
     this.splitter1.TabStop = false;
     // 
     // lv
     // 
     this.lv.Dock = System.Windows.Forms.DockStyle.Fill;
     this.lv.Location = new System.Drawing.Point(171, 0);
     this.lv.Name = "lv";
     this.lv.Size = new System.Drawing.Size(429, 600);
     this.lv.TabIndex = 2;
     this.lv.ItemActivate += new System.EventHandler(this.lv_ItemActivate);
     this.lv.AfterLabelEdit += new System.Windows.Forms.LabelEditEventHandler(this.lv_AfterLabelEdit);
     this.lv.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.lv_ColumnClick);
     this.lv.BeforeLabelEdit += new System.Windows.Forms.LabelEditEventHandler(this.lv_BeforeLabelEdit);
     // 
     // mainMenu1
     // 
     this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
                                                      this.menuItem1});
     // 
     // menuItem1
     // 
     this.menuItem1.Index = 0;
     this.menuItem1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
                                                      this.mnuSmallIcons,
                                                      this.mnuLargeIcons,
                                                      this.mnuList,
                                                      this.mnuDetails});
     this.menuItem1.Text = "&View";
     // 
     // mnuSmallIcons
     // 
     this.mnuSmallIcons.Index = 0;
     this.mnuSmallIcons.Text = "&Small Icons";
     this.mnuSmallIcons.Click += new System.EventHandler(this.mnuView_Click);
     // 
     // mnuLargeIcons
     // 
     this.mnuLargeIcons.Index = 1;
     this.mnuLargeIcons.Text = "&Large Icons";
     this.mnuLargeIcons.Click += new System.EventHandler(this.mnuView_Click);
     // 
     // mnuList
     // 
     this.mnuList.Index = 2;
     this.mnuList.Text = "Lis&t";
     this.mnuList.Click += new System.EventHandler(this.mnuView_Click);
     // 
     // mnuDetails
     // 
     this.mnuDetails.Index = 3;
     this.mnuDetails.Text = "&Details";
     this.mnuDetails.Click += new System.EventHandler(this.mnuView_Click);
     // 
     // Form1
     // 
     this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
     this.ClientSize = new System.Drawing.Size(600, 600);
     this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                              this.lv,
                                              this.splitter1,
                                              this.tvw});
     this.Menu = this.mainMenu1;
     this.Name = "Form1";
     this.Text = "Form1";
     this.ResumeLayout(false);
   }
   #endregion
   [STAThread]
   static void Main() 
   {
     Application.Run(new Form1());
   }
   private void lv_ItemActivate(object sender, EventArgs e)
   {
     ListView lv = (ListView)sender;
     foreach (ListViewItem lvi in lv.SelectedItems)
     {
       try
       {
         Process.Start(tvw.SelectedNode.FullPath + "\\" + lvi.Text);
       }
       catch
       {
       }
     }
   }
   public class SortListViewItems : IComparer    //  nested class
   {
     int columnIndex;
     ColumnType columnType;
     bool isAscending;
     public static Boolean isNameAscending = true;
     public static Boolean isBytesAscending = false;
     public static Boolean isExtAscending = false;
     public static Boolean isModifiedAscending = false;
     public static Boolean isAttribAscending = false;
     
     public SortListViewItems(int columnIndex, 
                     ColumnType columnType, 
                     bool isAscending)
     {
       this.columnIndex = columnIndex;
       this.columnType = columnType;
       this.isAscending = isAscending;
     }
   
     public int Compare(object x, object y)
     {
       string strFirst = 
         ((ListViewItem)x).SubItems[columnIndex].Text;
       string strSecond = 
         ((ListViewItem)y).SubItems[columnIndex].Text;
       
       switch (columnType)
       {
         case ColumnType.Alpha :
           if (isAscending)
             return strFirst.rupareTo(strSecond);
           else
             return strSecond.rupareTo(strFirst);
           
         case ColumnType.DateTimeValue :
           if (isAscending)
             return 
               DateTime.Parse(strFirst).
                 CompareTo(DateTime.Parse(strSecond));
           else
             return 
               DateTime.Parse(strSecond).
                 CompareTo(DateTime.Parse(strFirst));
           
         case ColumnType.Numeric :
           //  Special case blank byte values.
           if (strFirst == "")
             strFirst = "-1";
           if (strSecond == "")
             strSecond = "-1";
         
           if (isAscending)
             return 
               Double.Parse(strFirst).
                 CompareTo(Double.Parse(strSecond));
           else
             return 
               Double.Parse(strSecond).
                 CompareTo(Double.Parse(strFirst));
           
         default:
           return 0;      
       }      //  close switch block  
     }        //  close Compare method
   }          //  close nested SortListViewItems class
   private void lv_ColumnClick(object sender, ColumnClickEventArgs e)
   {
     ColumnType columnType;
     bool isAscending = true;
     string strName = ((ListView)sender).Columns[e.Column].Text;
     switch(strName)
     {
       case "Name": 
         columnType = ColumnType.Alpha;
         SortListViewItems.isNameAscending = 
             !SortListViewItems.isNameAscending;
         isAscending = SortListViewItems.isNameAscending;
         break;
       case "Bytes": 
         columnType = ColumnType.Numeric;
         SortListViewItems.isBytesAscending = 
             !SortListViewItems.isBytesAscending;
         isAscending = SortListViewItems.isBytesAscending;
         break;
       case "Ext.": 
         columnType = ColumnType.Alpha;
         SortListViewItems.isExtAscending = 
             !SortListViewItems.isExtAscending;
         isAscending = SortListViewItems.isExtAscending;
         break;
       case "Modified": 
         columnType = ColumnType.DateTimeValue;
         SortListViewItems.isModifiedAscending = 
             !SortListViewItems.isModifiedAscending;
         isAscending = SortListViewItems.isModifiedAscending;
         break;
       case "Attrib.": 
         columnType = ColumnType.Alpha;
         SortListViewItems.isAttribAscending = 
             !SortListViewItems.isAttribAscending;
         isAscending = SortListViewItems.isAttribAscending;
         break;
       default:
         columnType = ColumnType.Alpha;
         break;
     }
     
     lv.ListViewItemSorter = new SortListViewItems(e.Column, 
                                   columnType, 
                                   isAscending);
     lv.Sort();
   }            // close lv_ColumnClick
   private void lv_BeforeLabelEdit(object sender, LabelEditEventArgs e)
   {
     MessageBox.Show("About to edit\n" +
       "Item:" + e.Item.ToString() + "\n" +
       "label:" + e.Label );
   }
   private void lv_AfterLabelEdit(object sender, LabelEditEventArgs e)
   {
     MessageBox.Show("After edit\n" +
       "Item:" + e.Item.ToString() + "\n" +
       "label:" + e.Label );
   }
 }

}</source>