C#
フィールド化版(コンストラクタ初期化+ Form.Dispose連動)
出典: C# OpenFileDialog をフォームのフィールドにする時の正しい書き方 — フィールド化版(コンストラクタ初期化+ Form.Dispose連動)
public partial class ImportForm : Form
{
private readonly OpenFileDialog _csvOfd;
public ImportForm()
{
InitializeComponent();
_csvOfd = new OpenFileDialog
{
Title = "取り込みファイルを選択",
Filter = "CSVファイル(*.csv)|*.csv|Excel (*.xlsx)|*.xlsx|すべて(*.*)|*.*",
FilterIndex = 1,
Multiselect = false
};
//フォーム破棄時にOpenFileDialogもDisposeする
this.Disposed += (_, __)=> _csvOfd.Dispose();
}
private void btnImport_Click(object sender, EventArgs e)
{
if (_csvOfd.ShowDialog(this)== DialogResult.OK)
{
ImportCsv(_csvOfd.FileName);
// _csvOfd.FileName / FileNames / InitialDirectoryは次回まで保持される
}
}
}
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
Source収録記事
この snippet は記事の「フィールド化版(コンストラクタ初期化+ Form.Dispose連動)」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
10 件//多くの人がこう書いてる(俺も最初これだった) private void btnImport_Click(object sender, EventArgs e) { using (var ofd = new OpenFileDialog())未収録
private void btnImport_Click(object sender, EventArgs e)
#bba803994efe
private void btnImport_Click(object sender, EventArgs e) { using (var ofd = new OpenFileDialog()) {未収録
ローカルusing版(基本パターン)
#a50deba795dc
// Designer配置済みopenFileDialog1をクリックハンドラから使う private void btnImport_Click(object sender, EventArgs e) { if (this.openFileDialog1.ShowDialog(this)== DialogResult.OK)未収録
フィールド化+ Designer配置版(別解)
#3d4abf12c310
//インスタンスを使い回せば、前回フォルダから自動で開く if (_csvOfd.ShowDialog(this)== DialogResult.OK) { // ...取り込み処理...未収録
①前回開いたフォルダの自動記憶
#6a9c418cc3d7
public static class DialogFactory { public static OpenFileDialog CreateCsvOpenDialog() {未収録
② Filterプリセットを画面間で統一
#918442e2d423
// ❌ NG:毎回InitialDirectoryを上書き→記憶効果ゼロ private void btnImport_Click(object sender, EventArgs e) { _csvOfd.InitialDirectory = @"C:\Import"; // ←これが入ってると毎回ここから始まる未収録
① InitialDirectoryを毎回上書きしてて記憶効果ゼロ
#bd75157be9cc
