Warum scrollt das FolderBrowserDialog-Dialogfeld nicht zum ausgewählten Ordner?
Zeigen, wie auf diesem Screenshot, wird der ausgewählte Ordner ist nicht in Sicht. Es muss gescrollt werden, nach unten, um den ausgewählten Ordner.
Gleichen dialog zeigt den ausgewählten Ordner sichtbar, die auf verschiedenen computer
Ich habe es auf zwei Rechnern, beide mit windows 7. Es funktioniert einwandfrei, auf der einen, aber nicht an der 2nd. Sieht es etwas mit windows-Umgebung statt, die einige code-Fehler? Kann jemand empfehlen eine Lösung?
Es ist keine änderung im code. Ich benutzte längere Pfade von verschiedenen Laufwerken, aber die Ergebnisse sind die gleichen.
private void TestDialog_Click ( object sender, EventArgs e )
{
//Last path store the selected path, to show the same directory as selected on next application launch.
//Properties.Settings.Default.LastPath
FolderBrowserDialog dlgFolder = new FolderBrowserDialog ();
dlgFolder.RootFolder = Environment.SpecialFolder.DesktopDirectory;
dlgFolder.SelectedPath = Properties.Settings.Default.LastPath;
if (dlgFolder.ShowDialog () == System.Windows.Forms.DialogResult.OK)
{
Properties.Settings.Default.LastPath = dlgFolder.SelectedPath;
Properties.Settings.Default.Save ();
}
}
Kommentar zu dem Problem - Öffnen
Ja, es ist die Umwelt. Der dialog ist implementiert in Windows, nicht in Silverlight. Könnte auch ein Windows-Fehler, ich Wette, dass die normalerweise nicht vorhanden "Ordner" Textfeld ist die Ursache. Ohne Sie, die "Themen" Ordner sichtbar sein würde. Wenden Sie sich an Microsoft Support, wenn Sie wollen, verfolgen.
InformationsquelleAutor der Frage Munawar | 2011-08-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das grundlegende problem ist eine schlechte design-Entscheidung in der
FolderBrowserDialog
. Zuerst müssen wir erkennen, dass dieFolderBrowserDialog
nicht ein .NET-Steuerung ist, sondern dieCommon Dialog
und ist Teil von Windows. Der designer dieser dialog nicht gewählt um zu schicken, die das TreeView-Steuerelement einTVM_ENSUREVISIBLE
Meldung angezeigt, nachdem das Dialogfeld angezeigt wird, und eine erste Ordner ausgewählt ist. Diese Nachricht bewirkt, dass ein TreeView-Steuerelement, um so zu scrollen, dass das aktuell ausgewählte Element wird im Fenster sichtbar.So, alles was wir tun müssen um dies zu beheben, senden Sie die Strukturansicht, die ein Teil der
FolderBrowserDialog
dieTVM_ENSUREVISIBLE
Nachricht und alles wird groß sein. Richtig? Gut, nicht so schnell. Dies ist in der Tat die Antwort, aber es gibt einige Dinge, die stehen im Weg.Erstens, weil die
FolderBrowserDialog
ist nicht wirklich eine .NET-Steuerung, es hat keine interneControls
Sammlung. Dies bedeutet, dass wir nicht nur finden und Zugriff auf das TreeView-Kind-Steuerelement aus .NET.Zweite, die Designer des die .NET
FolderBrowserDialog
Klasse entschieden Dichtung dieser Klasse. Diese unglückliche Entscheidung, die uns daran hindert, es ableiten und überschreiben Sie im Fenster message-handler. Hatte, waren wir in der Lage, dies zu tun, haben wir vielleicht versucht die post dieTVM_ENSUREVISIBLE
Nachricht, wenn wir haben dieWM_SHOWWINDOW
Nachricht in der message-handler.Das Dritte Problem ist, dass wir nicht senden Sie die
TVM_ENSUREVISIBLE
Meldung bis zum Tree-View-control-tatsächlich existiert als ein echtes Fenster, und es nicht existiert, bis wir Sie rufen dieShowDialog
Methode. Jedoch, diese Methode blockiert, so dass wir nicht die Möglichkeit haben, buchen Sie unsere Nachricht, sobald diese Methode aufgerufen wird.Bekommen rund um diese Themen, habe ich eine statische helper-Klasse mit einer einzigen Methode, die verwendet werden können, um zu zeigen, eine
FolderBrowserDialog
, und führen Sie einen Bildlauf zu den ausgewählten Ordner. Ich Schaffe dies, indem man eine kurzeTimer
nur vor dem Aufruf des dialogsShowDialog
Methode, und dann das aufspüren der Griff desTreeView
Kontrolle in derTimer
handler (D. H., nach dem der Dialog angezeigt wird) und senden unsereTVM_ENSUREVISIBLE
Nachricht.Diese Lösung ist nicht perfekt, denn es hängt davon ab, einige Kenntnisse über die
FolderBrowserDialog
. Speziell, ich finde den Dialog mit der Fenster-Titel. Dies wird brechen, die mit nicht-englischen Installationen. Ich die Spur der untergeordneten Steuerelemente in den Dialog mit Ihren Dialog-Item-IDs, sondern als Titel, text oder Klassenname, weil ich glaubte, dies wäre zuverlässiger über die Zeit.Dieser code wurde getestet unter Windows 7 (64 bit), und Windows XP.
Hier ist der code:
(Sie brauchen können:
using System.Runtime.InteropServices;
)InformationsquelleAutor der Antwort Brad Oestreicher
Benutzt habe ich einen workaround von https://www.daniweb.com/software-development/csharp/threads/300578/folderbrowserdialog-expanding-the-selected-directory-
Es ist nicht der schönste Weg, aber es funktioniert für mich.
Ohne die
RootFolder
es funktioniert NICHT auf das erste rufen, aber auf der 2. und folgenden. Mit es, es funktioniert immer.Als andere haben beobachtet, dass dieser Fehler ist abhängig vom Betriebssystem:
Ich bin mit Win 7 Pro x64 SP1
InformationsquelleAutor der Antwort Tobias Knauss
Ich weiß, dieser thread ist so alt, aber mit extension-Methoden können Hinzugefügt werden, um den FolderBrowserDialog.Die ShowDialog-Methode, und dann wiederholt verwendet, wo erforderlich.
Probe (unten) ist nur mit der easy SendKeys-Methode (die ich hasse zu tun, aber in diesem Fall, es funktioniert gut). Bei der Verwendung der SendKeys-Methode zu springen, um den ausgewählten Ordner in das Dialogfeld, wenn Sie Debuggen in Visual Studio, dann die SendKeys-call gilt für den aktuellen Fensters, das das aktive VS-Fenster. Mehr narrensicher zu machen und zu vermeiden, das falsche Fenster aus immer die SendKeys-Nachricht, dann ist die extension-Methode enthalten würde, die externe Methode Aufrufe zum senden von Nachrichten an die spezifischen Fenster ähnlich zu dem, was Marc F geschrieben, aber übersetzt in C#.
InformationsquelleAutor der Antwort Brien Halstead
Las ich auf verschiedenen Foren, dass es sein könnte aufgrund RootFolder, weil SelectedPath und RootFolder sind, sich gegenseitig ausschließen, das heißt, beide können nicht co-existieren, aber mit Standard-RootFolder(.Desktop), Es ermöglicht zumindest, den Baum besteigen(navigieren Sie das Laufwerk/Ordner).
Jedoch, wenn RootFolder geändert wird, um anderen als der Desktop, würden Sie nicht in der Lage sein zu navigieren, um UNC-Pfade.
Antwort auf Hans Passant:
Ich habe versucht, diesem Dialog Extension, die TextBox, aber kein Glück.
Anpassen das Dialogfeld nach Ordner suchen, um den vollständigen Pfad anzeigen
InformationsquelleAutor der Antwort Munawar
auf VB.Net code, nur diesen code-Zeile rechts, bevor das Dialogfeld angezeigt.
InformationsquelleAutor der Antwort Loi Condes
Habe ich festgestellt, dass:
.SelectedPath
endet mit "\", werden im Dialog scrollen Sie nach unten, um den Pfad sichtbar..SelectedPath
endet nicht mit "\", der Pfad ist immer noch ausgewählt, aber nicht sichergestellt sichtbar.InformationsquelleAutor der Antwort René
Ich berechnet etwas VB.NET, so würde es leicht sein, um es zu transformieren in C#.
Ich bin Französisch, und ich bin Anfänger in VB.
Wie auch immer, Sie können versuchen, meine Lösung.
Meine Idee ist, der zum starten einer asynchronen Aufgabe nur vor, die zeigen, die
folderBrowserDialog
.Fand ich das selbst, aber ich war inspiriert von Brad post.
Hier ist mein code:
Ich warte auf Ihre Vorschläge.
Und kann jemand übersetzen es in C# weil ich nicht weiß, C#.
InformationsquelleAutor der Antwort Marc F
Hatte ich dasselbe problem in c++ /mfc. Es funktionierte für mich ::PostMessage statt ::SendMessage in die BFFM_INITIALIZED callback Platz in der TVM_ENSUREVISIBLE msg
InformationsquelleAutor der Antwort Stefan_l_01
dlgFolder.RootFolder = Environment.SpecialFolder.DesktopDirectory;
ist nicht das gleiche wie
dlgFolder.RootFolder = Environment.SpecialFolder.Desktop;
Was ist der Unterschied zwischen SpecialFolder.Desktop-und SpecialFolder.DesktopDirectory?
Den verlinkten thread zeigt, dass, wie ein Weg, Sie tun das gleiche Ergebnis erhalten. Aber Sie sind nicht die gleichen, wie man einen logischen Pfad und der andere ist ein physikalischer Pfad.
Ich habe festgestellt, wenn entweder eine zugewiesen ist, den RootFolder der "Ordner öffnen" - dialog, der daraus resultierende Verhalten kann unterschiedlich sein.
Als .RootFolder Zuordnung, einige windows-Versionen wie win7, behandeln Sie entweder als "Desktop". Das heißt, Sie können finden Sie in der "Computer" sub-entry -, und öffnen, um zu sehen, die einzelnen Laufwerksbuchstaben. Die .SelectedPath wird ausgewählt, entweder Weg, aber der gewählte Weg ist nur sichtbar, wenn die logischen Pfad der desktop zugewiesen ist .RootFolder.
Schlimmer, wenn mit Hilfe der durchsuchen-dialog Ordner in win10 pre-release, es scheint, dass "DesktopDirectory" als nur, der Inhalt der Desktop-Verzeichnis, nur ohne link überhaupt der logische desktop-Verzeichnis. Und nicht aufgelistet keine sub-Elemente unter. Sehr frustrierend, wenn eine app geschrieben für win7 versucht mit win10.
Ich denke, das problem der OP ist, ist, dass Sie beschäftigt die physischen desktop als root, Wann sollte Sie eingesetzt haben der logische desktop.
Ich habe keine Erklärung dafür, warum die OP ' s auf zwei verschiedenen Rechnern anders reagieren. Ich würde spekulieren, dass Sie zwei verschiedene Versionen von der .NET framework installiert ist.
Die Tatsache, dass win10 prerelease hat die "Stuck on Desktop" Problem mit dem Ordner suchen-dialog können durch die neueren .NET framework geliefert mit win10 Vorabversion. Leider habe ich unwissend bleiben alle Fakten in diesem (win10) Fall, das habe ich noch nicht aktualisiert.
P. S. ich fand, dass win8 auch Erfahrungen der "Stuck on Desktop" - symptom:
https://superuser.com/questions/869928/windows-8-1-folder-selection-dialog-missing-my-computer-and-sub-items
Den workaround gibt, war die Auswahl der Alternative GUI von win8. Vielleicht etwas ähnliches kann man in win10 Vorabversion.
InformationsquelleAutor der Antwort an odder guest
Habe ich gelesen der obigen Diskussion und Lösungen. Besonders Brat Oestreicher stellte mich in die richtige Richtung. Im wesentlichen müssen wir zuerst das TreeView-Steuerelement in der
SHBrowseForFolder
dialog, und senden Sie das Fenster derTVM_ENSUREVISIBLE
Nachricht. Das folgende tut dies in C.Vielen Dank Gary Beene Gebrochen.
InformationsquelleAutor der Antwort Paul Ogilvie
In Reaktion auf Marc F s post - ich habe umgewandelt VB.Net zu C#
Getestet, und es funktioniert gut. Stellen Sie sicher, Referenz-System.- Laufzeit.InteropServices, System.Threading, System.Threading.Aufgaben
InformationsquelleAutor der Antwort MC9000
Dieser link hat eine einfache Antwort, die war für mich in Ordnung (ich habe windows
8.1
)FolderBrowserDialog: Erweiterung des ausgewählten Verzeichnisses
InformationsquelleAutor der Antwort user1760527
dies funktioniert für mich
aber erst nach dem zweiten Einsatz des dialog
InformationsquelleAutor der Antwort user3458105