C#Dropbox of drives

我记得在vb6中有一个类似于dropbox / combobox的控件,你可以选择驱动器名称。 它会引发一个事件,然后您可以设置另一个控件来枚举列表框中的文件。 (在drive.event中你执行files.path = drive.path来获得这种影响)。

C#中有这样的东西吗? 一个控件,它会删除可用驱动器列表并在更改时引发事件?

没有内置控件可以做到这一点,但使用标准ComboBox很容易实现。 在表单上删除一个,将其DropDownStyle更改为DropDownList以防止编辑,并在表单的Load事件中添加以下行:

comboBox1.DataSource = Environment.GetLogicalDrives(); 

现在,您可以处理SelectedValueChanged事件,以便在有人更改所选驱动器时执行操作。

回答完这个问题后 ,我发现了另一种(更好的?)方法。 您可以使用DriveInfo.GetDrives()方法枚举驱动器并将结果绑定到ComboBox。 这样你可以限制哪些驱动器适用。 所以你可以从这开始:

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

现在comboBox1.SelectedValue将是DriveInfo类型,因此您将获得有关所选游戏的更多信息。 如果您只想显示网络驱动器,可以立即执行此操作:

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

我认为DriveInfo方法更灵活。

虽然Matt Hamiltons的回答是非常正确的,但我想知道问题本身是否正确。 因为,你为什么要这样的控制? 说实话,它感觉非常Windows 95。 请查看Windows用户体验互动指南: http : //msdn.microsoft.com/en-us/library/aa511258.aspx

特别是有关常见对话框的部分: http : //msdn.microsoft.com/en-us/library/aa511274.aspx

我会这样做:

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

Drive.IsReady的帮助下,您可以避免出现DeviceNotReadyDeviceUnavailable问题。

奖励:此处还有一个简单的“ChooseFile”示例,其中包括用于驱动器的ComboBox ,用于文件夹的TreeView以及用于文件的最后一个ListBox

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

就像VB6中的旧时代一样。