2009-03-08 7 views
4

Ich erinnere mich, in vb6 gab es ein Steuerelement, das ähnlich wie eine Dropbox/Combobox war, dass Sie den Laufwerksnamen auswählen können. Es löst ein Ereignis aus, mit dem Sie ein anderes Steuerelement festlegen können, das Dateien in Listbox aufzählt. (In drive.event machst du files.path = drive.path um diesen Effekt zu bekommen).C# Dropbox von Laufwerken

Gibt es in C# so etwas? ein Steuerelement, das eine Liste der verfügbaren Laufwerke ablegt und ein Ereignis auslöst, wenn es geändert wird?

+1

Warum willst du das? –

+0

Es gibt gute Gründe, warum Sie die dem System zur Verfügung stehenden Laufwerke auflisten müssen: Zum Beispiel müssen wir in der Lage sein, ein System so zu konfigurieren, dass verschiedene Geldbeträge in Abhängigkeit davon geladen werden, auf welchem ​​Laufwerk der Benutzer speichern möchte. (Nein, ich denke nicht, dass es eine gute Idee ist, aber der Kunde besteht darauf). – Jedidja

Antwort

13

Es gibt keine integrierte Steuerung dafür, aber es ist sehr einfach mit einer Standard-ComboBox zu erreichen. Schau mal einer auf dem Formular, ändern Sie den Dropdownstyle zu Dropdownlist-Bearbeitung zu verhindern, und in dem Load-Ereignisse für das Formular, fügen Sie diese Zeile:

comboBox1.DataSource = Environment.GetLogicalDrives(); 

Jetzt können Sie das SelectedValueChanged Ereignis behandeln, Maßnahmen zu ergreifen, wenn jemand die ausgewählten Änderungen Fahrt.

Nachdem ich this question beantwortet habe, habe ich einen anderen (besseren?) Weg gefunden, dies zu tun. Mit der DriveInfo.GetDrives() -Methode können Sie die Laufwerke auflisten und das Ergebnis an die ComboBox binden. Auf diese Weise können Sie begrenzen, welche Laufwerke apppear. So könnte man mit dieser beginnen:

comboBox1.DataSource = System.IO.DriveInfo.GetDrives(); 
comboBox1.DisplayMember = "Name"; 

Jetzt comboBox1.SelectedValue vom Typ Driveinfo sein, so finden Sie viele weitere Informationen über das ausgewählte Spiel. Und wenn Sie nur Netzlaufwerke zeigen möchten, können Sie dies jetzt tun:

comboBox1.DataSource = System.IO.DriveInfo.GetDrives() 
    .Where(d => d.DriveType == System.IO.DriveType.Network); 
comboBox1.DisplayMember = "Name"; 

Ich denke, die Driveinfo Methode viel flexibler ist.

+0

Perfekt, eine schöne Antwort. –

+0

seltsamerweise gab mir das * "Eine erste Chance Ausnahme des Typs 'System.UnauthorizedAccessException' aufgetreten in mscorlib.dll" * so wenn ich dies in Versuch fangen verwende ich denke, es wäre besser. –

3

Während Matt Hamiltons Antwort sehr korrekt war, frage ich mich, ob die Frage selbst ist. Warum, warum willst du so eine Kontrolle? Es fühlt sich sehr Windows 95 um ehrlich zu sein. Bitte werfen Sie einen Blick auf die Windows User Experience Interaktion Richtlinien: http://msdn.microsoft.com/en-us/library/aa511258.aspx

Vor allem der Abschnitt über gemeinsame Dialoge: http://msdn.microsoft.com/en-us/library/aa511274.aspx

+0

Es war eine Lösung, die ich in der Vergangenheit verwendet habe und ich hatte Angst, die Funktionalität zu emulieren, wie ich es in C++ tue :(. Auch ich bin sehr neu bei C# und nie würde die Antwort so einfach wie Matt Lösung –

1

Ich würde diesen Ansatz mit:

foreach (var Drives in Environment.GetLogicalDrives()) 
{ 
    DriveInfo DriveInf = new DriveInfo(Drives); 
    if (DriveInf.IsReady == true) 
    { 
     comboBox1.Items.Add(DriveInf.Name); 
    } 
} 

Mit Hilfe von Drive.IsReady kann u Vermeiden Sie DeviceNotReady oder DeviceUnavailable Probleme.

Bonus: Auch hier ist ein einfaches „ChooseFile“ Beispiel, das ein ComboBox für Antriebe umfasst, ein TreeView für Ordner und die zuletzt ein ListBox für Dateien.

namespace ChosenFile 
{ 
    public partial class Form1 : Form 
    { 
     // Form1 FormLoad 
     // 
     public Form1() 
     { 
      InitializeComponent(); 
      foreach (var Drives in Environment.GetLogicalDrives()) 
      { 
       DriveInfo DriveInf = new DriveInfo(Drives); 
       if (DriveInf.IsReady == true) 
       { 
        comboBox1.Items.Add(DriveInf.Name); 
       } 
      } 
     } 

     // ComboBox1 (Drives) 
     // 
     private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      if (comboBox1.SelectedItem != null) 
      { 
       ListDirectory(treeView1, comboBox1.SelectedItem.ToString()); 
      } 
     } 

     // ListDirectory Function (Recursive Approach): 
     // 
     private void ListDirectory(TreeView treeView, string path) 
     { 
      treeView.Nodes.Clear(); 
      var rootDirectoryInfo = new DirectoryInfo(path); 
      treeView.Nodes.Add(CreateDirectoryNode(rootDirectoryInfo)); 
     } 
     // Create Directory Node 
     // 
     private static TreeNode CreateDirectoryNode(DirectoryInfo directoryInfo) 
     { 
      var directoryNode = new TreeNode(directoryInfo.Name); 
      try 
      { 
       foreach (var directory in directoryInfo.GetDirectories()) 
        directoryNode.Nodes.Add(CreateDirectoryNode(directory)); 
      } 
      catch (Exception ex) 
      { 
       UnauthorizedAccessException Uaex = new UnauthorizedAccessException(); 
       if (ex == Uaex) 
       { 
        MessageBox.Show(Uaex.Message); 
       } 
      } 
      return directoryNode; 
     } 

     // TreeView 
     // 
     private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) 
     { 
      listBox1.Items.Clear(); 
      listBox1.Refresh(); 
      PopulateListBox(listBox1, treeView1.SelectedNode.FullPath.ToString(), "*.pdf"); 
     } 
     // PopulateListBox Function 
     // 
     private void PopulateListBox(ListBox lsb, string Folder, string FileType) 
     { 
      try 
      { 
       DirectoryInfo dinfo = new DirectoryInfo(Folder); 
       FileInfo[] Files = dinfo.GetFiles(FileType); 
       foreach (FileInfo file in Files) 
       { 
        lsb.Items.Add(file.Name); 
       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("An error occurred while attempting to load the file. The error is:" 
           + System.Environment.NewLine + ex.ToString() + System.Environment.NewLine); 
      } 
     } 

     // ListBox1 
     // 
     private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      if (listBox1.SelectedItem != null) 
      { 
       //do smt here! 
       MessageBox.Show(listBox1.SelectedItem.ToString()); 
      } 
     } 
    } 
} 

Genau wie die alten Zeiten in VB6.