C # Dropbox дисков - PullRequest
       25

C # Dropbox дисков

4 голосов
/ 08 марта 2009

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

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

Ответы [ 3 ]

13 голосов
/ 08 марта 2009

Нет встроенного элемента управления для этого, но это очень легко сделать с помощью стандартного 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 гораздо более гибкий.

3 голосов
/ 08 марта 2009

В то время как ответ Мэтта Хэмилтона был очень правильным, мне интересно, если сам вопрос. Потому что, зачем тебе такой контроль? Честно говоря, Windows 95 ощущается очень хорошо. Пожалуйста, ознакомьтесь с Руководством по взаимодействию с пользователем в Windows: http://msdn.microsoft.com/en-us/library/aa511258.aspx

Особенно раздел об общих диалогах: http://msdn.microsoft.com/en-us/library/aa511274.aspx

1 голос
/ 07 июня 2012

Я бы подошел к этому с:

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

С помощью Drive.IsReady вы можете избежать проблем 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.

...