下図のような「フォルダの選択」ダイアログを表示する方法を紹介します。
.NET Framework 1.1以降ではFolderBrowserDialogクラスを使用して表示します。まずはこの方法から説明します。
次の例ではルートフォルダをデスクトップ、始めに選択されているフォルダを"C:\Windows"として「フォルダの選択」ダイアログを表示しています。また、ユーザーが新しいフォルダを作成できるように「新しいフォルダ」ボタンが表示されるようにしています。
'FolderBrowserDialogクラスのインスタンスを作成 Dim fbd As New FolderBrowserDialog '上部に表示する説明テキストを指定する fbd.Description = "フォルダを指定してください。" 'ルートフォルダを指定する 'デフォルトでDesktop fbd.RootFolder = Environment.SpecialFolder.Desktop '最初に選択するフォルダを指定する 'RootFolder以下にあるフォルダである必要がある fbd.SelectedPath = "C:\Windows" 'ユーザーが新しいフォルダを作成できるようにする 'デフォルトでTrue fbd.ShowNewFolderButton = True 'ダイアログを表示する If fbd.ShowDialog(Me) = DialogResult.OK Then '選択されたフォルダを表示する Console.WriteLine(fbd.SelectedPath) End If
//FolderBrowserDialogクラスのインスタンスを作成 FolderBrowserDialog fbd = new FolderBrowserDialog(); //上部に表示する説明テキストを指定する fbd.Description = "フォルダを指定してください。"; //ルートフォルダを指定する //デフォルトでDesktop fbd.RootFolder = Environment.SpecialFolder.Desktop; //最初に選択するフォルダを指定する //RootFolder以下にあるフォルダである必要がある fbd.SelectedPath = @"C:\Windows"; //ユーザーが新しいフォルダを作成できるようにする //デフォルトでTrue fbd.ShowNewFolderButton = true; //ダイアログを表示する if (fbd.ShowDialog(this) == DialogResult.OK) { //選択されたフォルダを表示する Console.WriteLine(fbd.SelectedPath); }
.NET Framework 1.0では次のような方法により、「フォルダの選択」ダイアログの表示が可能になります。
まず、「参照設定」に「System.Design.dll」を追加し、さらに次のようなクラスを作ります。
Public Class BrowseFolder Inherits System.Windows.Forms.Design.FolderNameEditor Dim fb As New System.Windows.Forms.Design.FolderNameEditor.FolderBrowser() Public Function BrowseDialog(ByVal description As String, _ ByVal owner As Form) As String '説明を指定 fb.Description = description 'はじめのフォルダを指定 fb.StartLocation = _ System.Windows.Forms.Design.FolderNameEditor.FolderBrowserFolder.Desktop 'スタイルを指定 fb.Style = _ System.Windows.Forms.Design.FolderNameEditor.FolderBrowserStyles.RestrictToDomain If fb.ShowDialog(owner) = DialogResult.OK Then Return fb.DirectoryPath Else Return String.Empty End If End Function End Class
public class BrowseFolder : System.Windows.Forms.Design.FolderNameEditor { System.Windows.Forms.Design.FolderNameEditor.FolderBrowser fb = new System.Windows.Forms.Design.FolderNameEditor.FolderBrowser(); public string BrowseDialog(string description, Form owner) { //説明を指定 fb.Description = description; //はじめのフォルダを指定 fb.StartLocation = System.Windows.Forms.Design.FolderNameEditor.FolderBrowserFolder.Desktop; //スタイルを指定 fb.Style = System.Windows.Forms.Design.FolderNameEditor.FolderBrowserStyles.RestrictToDomain; if (fb.ShowDialog(owner) == DialogResult.OK) { return fb.DirectoryPath; } else { return string.Empty; } } }
実際に「フォルダの選択」ダイアログを表示するには次のようなコードを書きます。ここではダイアログを表示し、選択されたフォルダのパスをコンソールに表示します。
Dim f As New BrowseFolder() Console.WriteLine(f.BrowseDialog("フォルダを指定してください。", Me))
BrowseFolder f = new BrowseFolder(); Console.WriteLine(f.BrowseDialog("フォルダを指定してください。", this));
ただしこの方法でははじめに表示するフォルダにはStartLocationプロパティに指定できるフォルダ以外のフォルダを指定することは出来ないようです。
さらに、Win32 APIのSHBrowseForFolderを使用した例がマイクロソフトのページにあります。
、ALT+Nで新しいフォルダが追加されてしまうのはバグなんでしょうか。
.NetFramework4.5.2+VS2017ですが。
読み解けるひとには難しくないコードではありますが、一応簡単に解説
ちゃんと読み解いてませんが、スタックオーバーフローのやつは、ツリーを読み解いて再選択してキー操作で移動しているだけに見えるので、もっと単純に別スレッドで無理やりキー操作してみました。
以下はお馬鹿さんコードであることは理解してますが、お気楽実装できます。
Friend filepath as string = "c:\"
Friend filename as string = "aaa.txt"
Private Async Sub Button1_Click(sender As Object, e As RoutedEventArgs) Handles Button1.Click
Dim Task1 As Task = Task.Run(Sub()
'非同期処理
System.Threading.Thread.Sleep(500)
System.Windows.Forms.SendKeys.SendWait("{DOWN}{UP}")
End Sub)
Using dlg = New FolderBrowserDialog
'Dim a = DialogResult
dlg.SelectedPath = filepath
If dlg.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
filepath = dlg.SelectedPath.TrimEnd("\") & "\"
Else
MessageBox.Show("キャンセルしました")
End If
End Using
Await Task1
Me.TextBox1.Text = filepath & filename
End Sub
判り易かった