C#でOpenFileDialogが継承できない?それならフィールドに持っちゃえばいいんじゃね?

この記事は約 4 分で読めます。

みなさんこんにちは!ヒロポンです!

毎日張り切ってプログラミングの勉強してますか!!!!!

私は張り切ってやっています!!!!

さて今回はC#使いなら一度は使ったことがあるクラスOpenFileDialogについて書いていきたいと思います!

OpenFileDialogは継承できない!

このOpenFileDialogって初期設定が結構めんどくさい!!!

だから継承してCustomOpenFileDoalog的なものを作りたいがOpenFileDialogは継承が許されてません!

こんな感じでコンパイルエラーが出るので、コードの中身を見てみるとsealedクラスとして定義されています。

となるとどうあがいても継承はできません。

そこで、思ったのがOpenFileDialogをフィールドに持ったCustomOpenFileDialogを作ればよいのでは?ということ

実際にCustomOpenFileDialogを作ってみる。

とりあえずこんな感じで作ってみた。

using System;
using System.IO;
using System.Windows.Forms;

namespace CustomOpenFileDialog
{
    public class CustomOpenFileDialog
    {
        private OpenFileDialog _ofd;

        public string FileName => _ofd.FileName;

        public CustomOpenFileDialog()
        {
            _ofd = new OpenFileDialog();
            _ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            _ofd.Title = "ファイル選択";
            _ofd.Filter = "htmlファイル(*.html)| *.html";
        }

        public DialogResult ShowDialog()
        {
            return _ofd.ShowDialog();
        }
    }
}

画面はこんな感じで用意して

テキストボックス右側のボタンを押したらダイアログが立ち上がる仕組み

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CustomOpenFileDialog
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var cofd = new CustomOpenFileDialog();
            if (cofd.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = cofd.FileName;
            } 
        }
    }
}

これを実行すると下記のような感じになる。

初期画面ではちゃんとデスクトップが表示されていて、ダイアログのタイトルにもちゃんと値が入っている。

それにちゃんとフィルターもかかっている。

ファイルを選択すると下記のような感じになる。

ちゃんとファイルが選択されている。

これを応用すると下記のような感じにもできる。

まずはFilterTypeのEnumを作る

    public enum FilterType
    {
        HTML = 1,
        CSV
    }

でCustomOpenFileDialogのコンストラクタの引数にセットする。

    public class CustomOpenFileDialog
    {
        private OpenFileDialog _ofd;

        public string FileName => _ofd.FileName;

        public CustomOpenFileDialog(FilterType type)
        {
            _ofd = new OpenFileDialog();
            _ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            _ofd.Title = "ファイル選択";
            switch (type)
            {
                case FilterType.CSV:
                    _ofd.Filter = "csvファイル(*.csv)| *.csv";
                    break;
                case FilterType.HTML:
                    _ofd.Filter = "htmlファイル(*.html)| *.html";
                    break;
            }

        }

        public DialogResult ShowDialog()
        {
            return _ofd.ShowDialog();
        }
    }

使う側はこんな感じ

        private void button1_Click(object sender, EventArgs e)
        {
            var cofd = new CustomOpenFileDialog(FilterType.CSV);
            if (cofd.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = cofd.FileName;
            } 
        }

これで実行すると下記のような感じでFilterがちゃんと変わってる

継承ができなくても別の方法があるはず!

今回OpenFileDialogの継承ができないために別の方法で継承的なことをしたけども、結構こんなパターンが多いんですよね!!

でもいろいろ調べてみたら方法はありますし、なんなら方法を考えるのが楽しい!ってのがあります。

そもそもその方法を考えるのがエンジニアの仕事であって醍醐味であると思います!

とにかくこういうパターンは経験でしかないので、公私問わず勉強をして経験を積むしかないのでしょうね!!

今回のコードはGithubに上げています!

実際の動きを見たい場合はかきリポジトリにアクセスしてみてください!

https://github.com/adaman3568/blog-source-demo

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA