Frage

ich in VB6 merke es eine Kontrolle war, die ähnlich wie ein Dropbox / Combobox war, dass Sie die Laufwerksnamen auswählen können. Es wirft ein Ereignis, das Sie können dann eine andere Steuerung eingestellt, die Dateien in listbox aufzuzählen. (In drive.event Sie tun files.path = drive.path diese beeinflussen zu bekommen).

Gibt es etwas wie dies in C #? eine Steuerung, die eine Liste der verfügbaren Laufwerke nach unten fällt und löst ein Ereignis aus, wenn es geändert wird?

War es hilfreich?

Lösung

Es gibt keine eingebaute Steuerung, das zu tun, 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 das ausgewählte Laufwerk ändert.

Nach der Beantwortung diese Frage , ich habe eine anderen (besseren?) Weg gefunden, dies zu tun. Sie können die DriveInfo.GetDrives () Methode verwenden, um die Laufwerke aufzuzählen und das Ergebnis an die ComboBox zu binden. Auf diese Weise können Sie begrenzen, welche Laufwerke apppear. So könnte man mit diesen starten:

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

Jetzt wird comboBox1.SelectedValue vom Typ Driveinfo, so dass Sie viele weitere Informationen über das ausgewählte Spiel bekommen. 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.

Andere Tipps

Während Matt Hamiltons Antwort sehr richtig war, ich frage mich, ob die Frage selbst ist. Denn warum sollte man eine solche 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

Ich würde nähert dies 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 u vermeiden können Probleme DeviceNotReady oder DeviceUnavailable haben.

Bonus: Auch hier ist ein einfaches „ChooseFile“ Beispiel, das eine ComboBox für Laufwerke, eine TreeView für Ordner und die letzten einen ListBox für Dateien enthält.

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top