2009-03-08 8 views
4

Je me souviens que dans vb6 il y avait un contrôle similaire à une boîte de dépôt/combobox que vous pouvez sélectionner le nom du lecteur. Il déclenche un événement que vous pouvez ensuite définir un autre contrôle qui énumère les fichiers dans la zone de liste. (dans drive.event vous faites files.path = drive.path pour avoir cet effet).Boîte de dépôt C# des lecteurs

Y at-il quelque chose comme ça en C#? un contrôle qui fait tomber une liste de lecteurs disponibles et déclenche un événement quand il est changé?

+1

Pourquoi voulez-vous cela? –

+0

Il existe des raisons valables pour lesquelles vous devez pouvoir répertorier les lecteurs disponibles pour le système: par exemple, nous devons être en mesure de configurer un système pour facturer différentes sommes d'argent en fonction du lecteur sur lequel l'utilisateur choisit d'enregistrer. (Non, je ne pense pas que ce soit une bonne idée, mais le client insiste). – Jedidja

Répondre

13

Il n'y a pas de contrôle intégré pour le faire, mais c'est très facile à réaliser avec un ComboBox standard. Laissez tomber l'un sur votre formulaire, changer son DropDownStyle à DropDownList pour empêcher sa modification, et en cas de charge pour le formulaire, ajoutez cette ligne:

comboBox1.DataSource = Environment.GetLogicalDrives(); 

Vous pouvez maintenant gérer l'événement SelectedValueChanged à prendre des mesures quand quelqu'un change sélectionné conduire. Après avoir répondu this question, j'ai trouvé un autre moyen (meilleur?) De le faire. Vous pouvez utiliser la méthode DriveInfo.GetDrives() pour énumérer les lecteurs et lier le résultat à la zone de liste déroulante. De cette façon, vous pouvez limiter les lecteurs apppear. Ainsi, vous pouvez commencer avec ceci:

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

maintenant comboBox1.SelectedValue sera de type DriveInfo, de sorte que vous aurez beaucoup plus d'informations sur le jeu sélectionné. Et si vous voulez seulement afficher les lecteurs réseau, vous pouvez le faire maintenant:

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

Je pense que la méthode DriveInfo est beaucoup plus flexible.

+0

Parfait, une belle réponse. –

+0

étrangement cela m'a donné * "Une exception de première chance de type 'System.UnauthorizedAccessException' s'est produite dans mscorlib.dll" * donc si je l'utilise dans try attrape je suppose que ce serait mieux. –

3

Alors que la réponse de Matt Hamiltons était très correcte, je me demande si la question elle-même est. Parce que, pourquoi voudriez-vous un tel contrôle? Il se sent très Windows 95 pour être honnête. S'il vous plaît consulter les lignes directrices d'interaction de l'expérience utilisateur Windows: http://msdn.microsoft.com/en-us/library/aa511258.aspx

En particulier, la section sur les boîtes de dialogue communes: http://msdn.microsoft.com/en-us/library/aa511274.aspx

+0

C'était une solution que j'ai utilisée dans le passé et j'avais peur d'émuler la fonctionnalité car je suis habitué à le faire en C++ :(Aussi, je suis très nouveau chez C# et je n'aurais jamais pensé que la solution est aussi simple que Matt –

1

J'aborderions cela avec:

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

Avec l'aide de Drive.IsReady u peut éviter d'avoir des problèmes DeviceNotReady ou DeviceUnavailable.

Bonus: également ici est un simple « ChooseFile » exemple qui comprend un ComboBox pour les lecteurs, un TreeView pour les dossiers et le dernier un ListBox pour les fichiers.

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()); 
      } 
     } 
    } 
} 

Tout comme les anciens temps dans VB6.

Questions connexes