以下のスナップショットをご覧ください。これは、Visual Studio 2008 の「新しいプロジェクトの作成」ワークフローから取得したものです。
プロジェクトを保存するフォルダを選択するウィンドウです。C# アプリケーションで同様のウィンドウを作成するにはどうすればよいですか?
デフォルトの FolderBrowserDialog とその制限に関する良い記事を見つけました: http://www.ssware.com/articles/folderbrowserdialog-unmasked-everything-you-wanted-to-know-about-the-folder-browser-component-from -dotnet-framework.htm
WinForms、ASP.net、および WPF のファイルおよびフォルダー ブラウザー コントロールのような Windows エクスプローラーを提供する sswareのサード パーティ コンポーネント「Shell MegaPack」( http://www.ssware.com/megapack.htm ) があります。
コードを C# から VB に変更しました。私の環境は VS2015 + Office 2010 です。Daniel のコードの一部の関数は Office 2003/2007 のみをサポートしているため、私のコードは Daniel のものとは少し異なります。
新しい Excel インスタンスを使用すると、OpenFileDialog または OpenFolderDialog を開くよりも遅くなりますが、よりユーザー フレンドリーになります。私のプログラムはこのコードを 1 回しか呼び出していないので、私の場合、パフォーマンスと使いやすさのトレードオフは問題ではありません。
Imports Microsoft.Office
Imports Excel = Microsoft.Office.Interop.Excel
Private Sub Button_select_raw_dir_Click(sender As Object, e As EventArgs) Handles Button_select_raw_dir.Click
Dim raw_app As Excel.Application = New Excel.Application
Dim raw_data_open_folder_dialog As Microsoft.Office.Core.FileDialog
raw_data_open_folder_dialog = raw_app.FileDialog(Microsoft.Office.Core.MsoFileDialogType.msoFileDialogFolderPicker)
raw_data_open_folder_dialog.AllowMultiSelect = False
raw_data_open_folder_dialog.Title = "Please select the raw data's dir "
Dim nres As Integer = raw_data_open_folder_dialog.Show()
Dim sz_SelectedPath As String = Nothing
If nres = -1 Then '-1 means open... lol
For Each selectedItems As Object In raw_data_open_folder_dialog.SelectedItems
sz_SelectedPath = selectedItems.ToString()
Next
TextBox_raw_data_dir.Text = sz_SelectedPath
End If
raw_app.Quit()
ReleaseComObject(raw_app)
GC.Collect()
GC.WaitForPendingFinalizers()
End Sub
' Release excel objects to avoid memory leak
Public Sub ReleaseComObject(ByRef obj As Object)
Try
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
obj = Nothing
Catch ex As Exception
obj = Nothing
MsgBox("Exception! Failed to release com obj, debug your code.")
End Try
End Sub
C# バージョンが必要な場合は、C# に移植するのに十分賢いと思います :)