C # Dropbox дисков

Я помню, в vb6 был элемент управления, похожий на dropbox / combobox, который вы можете выбрать имя диска. Он вызывает событие, которое затем можно установить другим элементом управления, который перечисляет файлы в списке. (в drive.event вы делаете file.path = drive.path, чтобы получить этот эффект).

В C # есть что-то подобное? элемент управления, который опускает список доступных дисков и вызывает событие при его изменении?

    Для этого нет встроенного элемента управления, но его очень легко выполнить со стандартным ComboBox. Отбросьте его в своей форме, измените его DropDownStyle на DropDownList, чтобы предотвратить редактирование, а в событии Load для формы добавьте эту строку:

    comboBox1.DataSource = Environment.GetLogicalDrives(); 

    Теперь вы можете обработать событие SelectedValueChanged, чтобы принять меры, когда кто-то меняет выбранный диск.

    Отвечая на этот вопрос , я нашел еще один (лучший?) Способ сделать это. Вы можете использовать метод DriveInfo.GetDrives () для enums дисков и привязки результата к 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 намного более гибкий.

    Ответ Мэтта Гамилтона был очень правильным, мне интересно, есть ли этот вопрос. Потому что, зачем вам такой контроль? Честно говоря, это 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 вы можете избежать DeviceNotReady с DeviceNotReady или DeviceUnavailable .

    Бонус: Также здесь представлен простой пример «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.