2013-01-15 43 views
1

icons not shown![][1]我正在C#WinForms中工作。我製作了一個顯示邏輯目錄的Windows資源管理器,然後當點擊它們時,它會在ListView中顯示它們中的文件(舊的但棘手的事情)。我得到的圖標從系統,使用:如何在自制Windows資源管理器中正確顯示圖標?

Icon iconForFile = SystemIcons.WinLogo; 
ListViewItem lv = new ListViewItem(filData, imageList1.Images.Count); 
lv.Tag = file; 
iconForFile = Icon.ExtractAssociatedIcon(file); 
string Extension = Path.GetExtension(file); 

if (!imageList1.Images.ContainsKey(file)) 
{ 
    // If not, add the image to the image list. 
    iconForFile = System.Drawing.Icon.ExtractAssociatedIcon(file); 
    imageList1.Images.Add(file, iconForFile); 
} 

lv.ImageKey = file; 
listView1.SmallImageList = imageList1; 

現在的問題是這樣的:它不顯示圖標,點擊在一級目錄時,但是當我點擊任何目錄中的文件夾(即「。 C「),它不會在目錄的子文件夾中顯示圖標。請幫助我如何定製它。我完整的代碼是有點像這樣:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     PopulateTreeView(treeView1); 
    } 

    private void PopulateTreeView(TreeView tv) 
    { 
     string[] drives = Environment.GetLogicalDrives(); 
     TreeNode MyCnode = new TreeNode(); 
     MyCnode = new TreeNode("My Computer"); 
     tv.Nodes.Add(MyCnode); 
     foreach (string drive in drives) 
     { 
      TreeNode nodeDrive = new TreeNode(); 
      nodeDrive.Tag = drive; 
      nodeDrive.Text = drive; 
      tv.Nodes.Add(nodeDrive); 
      // tv.Nodes.Add(); 
      // nodeDrive.EnsureVisible(); 
      // treeView1.Refresh(); 

      try 
      { 
       //add dirs under drive 
       if (Directory.Exists(drive)) 
       { 
        foreach (string dir in Directory.GetDirectories(drive)) 
        { 
         TreeNode node = new TreeNode(); 
         node.Tag = dir; 
         node.Text = dir.Substring(dir.LastIndexOf(@"\") + 1); 
         node.ImageIndex = 1; 
         nodeDrive.Nodes.Add(node); 
        } 
       } 

      } 
      catch (Exception)  
      { 
      } 
      MyCnode.Expand(); 
     } 
    } 

    public TreeNode GetDirectory(TreeNode parentNode) 
    { 

     DirectoryInfo d = new DirectoryInfo(parentNode.FullPath); 
     DirectoryInfo[] dInfo = d.GetDirectories() 
            .Where(di => !di.Attributes.HasFlag(FileAttributes.System)) 

            .Where(di => !di.Attributes.HasFlag(FileAttributes.Hidden)) 
            .ToArray(); 

     parentNode.Nodes.Clear(); 
     if (dInfo.Length > 0) 
     { 
      TreeNode treeNode = new TreeNode(); 

      foreach (DirectoryInfo driSub in dInfo) 
      { 

       treeNode = parentNode.Nodes.Add(driSub.Name); 
       treeNode.Nodes.Add(""); 

      } 
     } 

     return parentNode; 
    } 

    private void AddFiles(string strPath) 
    { 
     try 
     { 
      listView1.BeginUpdate(); 
      listView1.Items.Clear(); 
      //headers listview 
      // listView1.Columns.Add("File Name", 200); 
      //listView1.Columns.Add("Size", 80); 
      //listView1.Columns.Add("Last Accessed", 110); 

      string[] dirData = new string[3]; 
      string[] filData = new string[3]; 
      string[] files = Directory.GetFiles(strPath); 
      foreach (string file in files) 
      { 
       FileInfo finfo = new FileInfo(file); 
       FileAttributes fatr = finfo.Attributes; 
       string name = Path.GetFileNameWithoutExtension(file); 
       filData[0] = name; 
       filData[1] = finfo.Length.ToString(); 
       filData[2] = File.GetLastAccessTime(file).ToString(); 
       // Set a default icon for the file. 
       Icon iconForFile = SystemIcons.WinLogo; 
       ListViewItem lv = new ListViewItem(filData, imageList1.Images.Count); 
       lv.Tag = file; 
       iconForFile = Icon.ExtractAssociatedIcon(file); 
       string Extension = Path.GetExtension(file); 
       if (!imageList1.Images.ContainsKey(file)) 
       { 
        // If not, add the image to the image list. 
        iconForFile = System.Drawing.Icon.ExtractAssociatedIcon(file); 
        imageList1.Images.Add(file, iconForFile); 
       } 
       lv.ImageKey = file; 

       listView1.SmallImageList = imageList1; 
       listView1.Items.Add(lv); 
      } 
     } 

     catch (Exception Exc) { MessageBox.Show(Exc.ToString()); } 

     listView1.EndUpdate(); 
    } 

    private void listView1_MouseDoubleClick(object sender, MouseEventArgs e) 
    { 
     string pathdoubleClicked = listView1.FocusedItem.Tag.ToString(); 

     Process.Start(pathdoubleClicked); 
    } 

    private void treeView1_AfterExpand(object sender, TreeViewEventArgs e) 
    { 
     GetDirectory(e.Node); 
     treeView1.SelectedNode.Expand(); 
     AddFiles(e.Node.FullPath.ToString()); 
    } 
} 
+0

認真沒有人可以修復一個小錯誤......多數民衆贊成在奇怪的:| | – engineer41

回答

0

的人仍然看到這是一個答案,搜索,需要的物品被添加到圖像列表的前完成對圖像列表的分配。

private void AddFiles(string strPath) 
{ 
    try 
    { 
     listView1.BeginUpdate(); 
     listView1.Items.Clear(); 
     listView1.SmallImageList = imageList1; 
相關問題