はじめに
本記事では、Windows Forms アプリでフォルダ選択ダイアログ FolderBrowserDialog を使い、ShowDialog でモーダル表示して選択結果(SelectedPath)を受け取る基本を丁寧に解説します。戻り値の扱い、オーナー(親フォーム)の指定、初期フォルダの設定、キャンセル時の分岐など、実務でつまずきやすいポイントを網羅します。
説明
FolderBrowserDialog は「フォルダを1つ選ばせたい」場面で使う標準ダイアログです。ShowDialog を呼び出すとモーダルで表示され、ユーザーの操作が完了するまで呼び出し元の処理は停止します。主なプロパティとメソッドは次の通りです。
・Description:ダイアログ上部に表示する説明文。
・SelectedPath:初期フォルダの指定&ユーザーが決定したフォルダの取得。
・ShowNewFolderButton:新しいフォルダ作成ボタンの表示/非表示。
・ShowDialog() / ShowDialog(IWin32Window owner):ダイアログを表示。後者は「親」ウィンドウを指定でき、ダイアログの前面固定やZオーダーの不具合回避に有効です。
ShowDialog の戻り値は DialogResult 列挙体で、一般的には DialogResult.OK のときだけ SelectedPath を利用します。キャンセルや×クローズの場合は DialogResult.Cancel などが返ります。
サンプルコード
以下は「参照…」ボタンでフォルダ選択ダイアログを開き、選んだパスをテキストボックスに表示する最小構成のフォームアプリです。フォームを自前で組み立てているので、プロジェクトに貼り付けるだけで動きが見えます。
using System; using System.Windows.Forms;
public class MainForm : Form
{
private TextBox pathTextBox;
private Button browseButton;
public MainForm()
{
Text = "FolderBrowserDialog + ShowDialog サンプル";
Width = 640;
Height = 120;
StartPosition = FormStartPosition.CenterScreen;
var label = new Label
{
Text = "フォルダ:",
Left = 12,
Top = 18,
AutoSize = true
};
pathTextBox = new TextBox
{
Left = 70,
Top = 14,
Width = 460,
Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right
};
browseButton = new Button
{
Text = "参照...",
Left = 540,
Top = 12,
Width = 80,
Anchor = AnchorStyles.Top | AnchorStyles.Right
};
browseButton.Click += BrowseButton_Click;
Controls.Add(label);
Controls.Add(pathTextBox);
Controls.Add(browseButton);
}
private void BrowseButton_Click(object sender, EventArgs e)
{
// ダイアログは使い終わったら Dispose されるよう using を使う
using (var dialog = new FolderBrowserDialog())
{
// ダイアログ上部に説明を表示
dialog.Description = "バックアップ先のフォルダを選択してください";
// 初期フォルダ(例:ドキュメント)
dialog.SelectedPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
// 新しいフォルダ作成ボタンを表示
dialog.ShowNewFolderButton = true;
// 親フォームを指定してモーダル表示
var result = dialog.ShowDialog(this);
// OK のときだけ選択結果を反映
if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(dialog.SelectedPath))
{
pathTextBox.Text = dialog.SelectedPath;
}
else
{
// Cancel/Close の場合は何もしない(必要に応じてログやガイド表示など)
}
}
}
}
【解説】
(1)フォーム構築:ラベル・テキストボックス・ボタンをコードで配置。アンカーを設定して横幅変更時も綺麗に伸縮します。
(2)ダイアログのライフサイクル:using ブロックで生成・破棄を自動化。ネイティブリソースを掴むコンポーネントなので Dispose を忘れないのが基本です。
(3)初期フォルダ:SelectedPath に既定パスを入れておけば、ユーザーは目的地に素早く到達できます。よくある初期値は Environment.SpecialFolder の列挙(例:MyDocuments、Desktop)。
(4)モーダル表示とオーナー:ShowDialog(this) とオーナーを明示すると、メインフォームの背後に隠れるトラブルを防げます。アプリのフォーカス制御も安定します。
(5)戻り値の扱い:DialogResult.OK のときだけ SelectedPath を採用。Cancel/Close を誤って処理しないよう分岐をシンプルに保ちます。
つまづきポイント
・[STAThread] を忘れる:エントリポイントに [STAThread] がないと COM ベースのダイアログで問題が出ることがあります。テンプレートを変えた場合は特に確認を。
・オーナー未指定で背面に回る:ShowDialog()(引数なし)だと、まれに親フォームの背後に回る現象が起きます。基本は ShowDialog(this) を推奨。
・キャンセル時の処理漏れ:Cancel のときに前回のパスをそのまま使ってしまうバグは定番。必ず DialogResult を見てから反映しましょう。
・初期フォルダの誤解:SelectedPath は「初期値の設定」と「結果の取得」を兼ねます。表示前に設定、OK 後に取得、という2段階の使い分けがポイント。
・Dispose 忘れ:ダイアログは生成のたびに using で囲む習慣に。長時間の多重表示でリソースリークを避けます。
・長いパスや権限:非常に長いパスやアクセス権のない場所では失敗する可能性があります。必要なら選択後の検証(存在確認、アクセス可否チェック)を追加しましょう。
まとめ
FolderBrowserDialog の ShowDialog は、モーダル表示→DialogResult 判定→SelectedPath 利用、という3ステップが基本です。オーナー指定と初期フォルダ設定、そしてキャンセル時の扱いを押さえれば、ユーザーにとって迷いが少なく安全なフォルダ選択体験を提供できます。日々のツールや設定ダイアログに、そのまま組み込んで活用してください。
記事タイトル:Windows Forms:FolderBrowserDialog の ShowDialog を使ったフォルダ選択の基本と実践
Description:Windows Forms の FolderBrowserDialog を用い、ShowDialog の戻り値処理、オーナー指定、初期フォルダ設定、キャンセル時の分岐までを初心者にもわかりやすく解説。貼り付けて動く C# サンプル付き。
メタキーワード:Windows Forms, C#, FolderBrowserDialog, ShowDialog, SelectedPath, DialogResult, フォルダ選択, WinForms



コメント