2017-01-24 5 views
0

До сих пор я создал File Explorer - однако я хочу добавить кнопку, которая позволит открыть выбранный файл при нажатии. Я слышал об OpenFileDialog, но мне кажется, что он показывает каталог, который мне не нужен. Есть идеи? Это код, который у меня есть, с использованием C#.Добавление кнопки «Открыть файл» для выбранного файла

file explorer showing specific files

namespace SynchronizeTaskPaneAndRibbon 
{ 
    public partial class FileChooser : UserControl 
    { 
     private void PopulateTreeView() 
     { 
      TreeNode rootNode; 

      DirectoryInfo info = new DirectoryInfo(@"../.."); 
      if (info.Exists) 
      { 
       rootNode = new TreeNode(info.Name); 
       rootNode.Tag = info; 
       GetDirectories(info.GetDirectories(), rootNode); 
       treeView1.Nodes.Add(rootNode); 
      } 
     } 

     private void GetDirectories(DirectoryInfo[] subDirs, TreeNode nodeToAddTo) 
     { 
      TreeNode aNode; 
      DirectoryInfo[] subSubDirs; 
      foreach (DirectoryInfo subDir in subDirs) 
      { 
       aNode = new TreeNode(subDir.Name, 0, 0); 
       aNode.Tag = subDir; 
       aNode.ImageKey = "folder"; 
       try 
       { 
        subSubDirs = subDir.GetDirectories(); 
       } 
       catch (System.UnauthorizedAccessException) 
       { 
        subSubDirs = new DirectoryInfo[0]; 
       } 
       if (subSubDirs.Length != 0) 
       { 
        GetDirectories(subSubDirs, aNode); 
       } 
       nodeToAddTo.Nodes.Add(aNode); 
      } 
     } 

public FileChooser() 
     { 
      InitializeComponent(); 
      PopulateTreeView(); 
      this.treeView1.NodeMouseClick += new TreeNodeMouseClickEventHandler(this.treeView1_NodeMouseClick); 
     } 

    void treeView1_NodeMouseClick(object sender,TreeNodeMouseClickEventArgs e) 
    { 
     TreeNode newSelected = e.Node; 
     listView1.Items.Clear(); 
     DirectoryInfo nodeDirInfo = (DirectoryInfo)newSelected.Tag; 
     ListViewItem.ListViewSubItem[] subItems; 
     ListViewItem item = null; 

     foreach (DirectoryInfo dir in nodeDirInfo.GetDirectories()) 
     { 
      item = new ListViewItem(dir.Name, 0); 
      subItems = new ListViewItem.ListViewSubItem[] 
         {new ListViewItem.ListViewSubItem(item, "Directory"), 
       new ListViewItem.ListViewSubItem(item, 
      dir.LastAccessTime.ToShortDateString())}; 
      item.SubItems.AddRange(subItems); 

     } 
     foreach (FileInfo file in nodeDirInfo.GetFiles()) 
     { 
      if (file.Extension == ".xlsx" || file.Extension == ".xls" || file.Extension == ".xlsm" || file.Extension == ".csv") 
      { 
       item = new ListViewItem(file.Name, 1); 
       subItems = new ListViewItem.ListViewSubItem[] 
          { new ListViewItem.ListViewSubItem(item, "File"), 
       new ListViewItem.ListViewSubItem(item, 
      file.LastAccessTime.ToShortDateString())}; 

       item.SubItems.AddRange(subItems); 
       listView1.Items.Add(item); 
      } 

     } 

     listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); 
    } 
+0

Передайте полный путь к вашему файлу в [Process.Start()] (https://msdn.microsoft.com/en-us/library/53ezey2s (v = vs.110) .aspx). Приложение, связанное с расширением этого файла, получит это имя файла. –

+0

Спасибо @Idle_Mind, как я могу реализовать это в том, что у меня есть? –

ответ

1

Во-первых, при создании ListViewItems, я бы добавить полный путь файла в .Tag, так что вы можете получить его легко:

item.Tag = file.FullName; 

Тогда вы 'd используйте что-то вроде этого при событии нажатия кнопки:

private void button1_Click(object sender, EventArgs e) 
{ 
    if (listView1.SelectedItems.Count > 0) 
    { 
     foreach(ListViewItem lvi in listView1.SelectedItems) 
     { 
      if (lvi.Tag != null && lvi.Tag is string) 
      { 
       string fullPathFile = lvi.Tag.ToString(); 
       try 
       { 
        Process.Start(fullPathFile); 
       } 
       catch (Exception ex) 
       { 
        MessageBox.Show("FileName: " + fullPathFile + "\r\n\r\n" + ex.ToString(), "Error Opening File"); 
       } 
      } 
     } 
    } 
} 
Смежные вопросы