ヽ|∵|ゝ(Fantom) の 開発blog? ホーム »VisualStudio
カテゴリー「VisualStudio」の記事一覧

【VisualStudio】【C#】OpenFileDialog(ファイルを開くダイアログ)でファイル名を取得する  


 前回はテキストボックスにドラッグ&ドロップでファイル名を取得できるようにしてみたが、今回は「参照」ボタンを押したとき、「ファイルを開く」ダイアログ(OpenFileDialog)を出して選択する方法をやってみよう。ユーザーによってドラッグ&ドロップを使うかオープンファイルダイアログを使うかはわからないので、両方実装しておくと便利だ。



 オープンファイルダイアログを実装するには「OpenFileDialog」クラスを使う。それでは実際にやってみよう。

(※) Visual Studio 2017 / Windows10(x64) で確認

 例えばコントロールに図のような名前が付いているとき、テキストボックスの横にある「参照」ボタンを押すと、「ファイルを開く」ダイアログが表示され、ファイルを選択するとテキストボックスにファイル名が入力されるようにしてみよう。そのやり方とコードは以下のようになる。



1.デザイン画面でボタンをダブルクリックまたはプロパティウィンドウのイベント(雷アイコンを押す)で「Click」が空欄ならダブルクリックでイベントハンドラを作成する。



2.生成されたクリックのイベントハンドラ「buttonInput_Click()」(または buttonOutput_Click())にオープンファイルダイアログの表示とファイル名取得のコードを書く。

 コードの例は以下を見て欲しい。

●「ファイルを開く」ダイアログでファイル名を取得する
using System;
using System.Drawing;
using System.Windows.Forms;

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

private void Form1_Load(object sender, EventArgs e)
{
}

private void buttonInput_Click(object sender, EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();

//TextBoxにファイル名が入力されていた場合、デフォルトの名前とディレクトリとする(無いときは現在のディレクトリ)
string file = textBoxInput.Text.Trim();
if (!string.IsNullOrEmpty(file))
{
dlg.FileName = System.IO.Path.GetFileName(file);
dlg.InitialDirectory = System.IO.Path.GetDirectoryName(file);
}

//拡張子のフィルタを設定する(*.html;*.htm のように複数指定もできる)
dlg.Filter = "テキストファイル(*.txt)|*.txt|すべてのファイル(*.*)|*.*";
//dlg.FilterIndex = 2; //2番目のフィルタをデフォルトにする(1~n)

dlg.Title = "ファイルを選択してください"; //ダイアログのタイトル文字

//ダイアログを表示する→「開く」のとき
if (dlg.ShowDialog() == DialogResult.OK)
{
//ファイル名をTextBoxに表示する
textBoxInput.Text = dlg.FileName;
}
}
}
}

 ファイルフィルタは説明とフィルタを「|」(パイプ, バーティカルバー)でペアにし、他の拡張子との区切りにも「|」を使う。類似の拡張子を「;」(セミコロン)でまとめることもできる。例えば HTML などの場合は、"HTMLファイル(*.html;*.htm)|*.html;*.htm" のようにすれば良い。

 また、今回は簡略のため割愛するが「buttonOutput_Click()」の方も同じようにやればオープンファイルダイアログが簡単に実装できる。コードもメソッドの中身をほぼまるごとコピーすれば良いので(※コントロール名のみ要修正)自分でやってみよう。

 このコードに前回の「ドラッグ&ドロップでファイル名を取得」を加えれば、ユーザビリティは高くなる。せっかくの GUI なので、なるべく簡単にファイルを扱えるようにしておいてあげよう(MS-DOS時代は面倒でしたよホント…(笑))。


(関連記事)
【VisualStudio】【C#】ドラッグ&ドロップでファイル名を取得する


スポンサーサイト

category: VisualStudio

thread: プログラミング

janre: コンピュータ

tag: VisualStudioリファレンス 
tb: 0   cm: --

【VisualStudio】【C#】ドラッグ&ドロップでファイル名を取得する  


 今回は前回使用したフォームアプリケーションのテキストボックスにドラッグ&ドロップでファイル名を取得できるようにしてみよう。これはコンボボックスやリストビューなどでも同じなので、一度書いておけば他のコントロールでもコピペで機能追加できる。

 コントロールにドラッグ&ドロップを実装するには「Control.DragEnter」イベントと「Control.DragDrop」イベントを使う。またそれぞれのコントロールの「Control.AllowDropControl.AllowDrop」プロパティを true にしておく必要がある。それでは実際にやってみよう。

(※) Visual Studio 2017 / Windows10(x64) で確認

 例えばコントロールに図のような名前が付いているとき、テキストボックスにエクスプローラからファイルをドラッグ&ドロップしたとき、ファイル名が自動で代入されるようにしてみよう。そのやり方とコードは以下のようになる。



●各コントロールごとにドラッグ&ドロップイベントを許可する

1.デザイン画面で「textBoxInput」をクリックしてプロパティウィンドウで「AllowDrop」を true にする。



2.プロパティウィンドウをイベントに切り替え(雷アイコンを押す)、「DragEnter」と「DragDrop」イベントが空欄ならダブルクリックでイベントハンドラを作成する。



3.ドラッグ開始(コントロール上に入った)のイベントハンドラ「textBoxInput_DragEnter()」にファイルの取得方法の指定を、ドロップのイベントハンドラ「textBoxInput_DragDrop()」にファイル名取得のコードを書く。

 コードの例は以下を見て欲しい。

●ドラッグ&ドロップでファイル名を取得する
using System;
using System.Drawing;
using System.Windows.Forms;

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

private void Form1_Load(object sender, EventArgs e)
{
}

private void textBoxInput_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop)) //ファイルリストがあれば
{
e.Effect = DragDropEffects.Copy;
}
}

private void textBoxInput_DragDrop(object sender, DragEventArgs e)
{
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); //ファイルリストを取得

foreach (string f in files)
{
textBoxInput.Text = f;
break; //はじめの1つのみ
}
}
}
}

 ドロップのイベントハンドラ「textBoxInput_DragDrop()」ではファイルリストを foreach で回しているが、テキストボックスの場合1つで良いので break している。リストビューなどに使う場合はすべてのファイルをアイテムなどに追加していけば良い。

 また、今回は簡略のため割愛するが「textBoxOuput」の方も同じようにやればドラッグ&ドロップが簡単に実装できる。コードもメソッドの中身をほぼまるごとコピーすれば良いので(※コントロール名のみ要修正)自分でやってみよう。

 このコードに前回の「プロパティの保存」を加えれば、ドラッグ&ドロップでファイル指定、アプリ終了で前回の状態を保存すれば使い勝手の良いものになる。ファイル名取得の場合「参照」ボタンが付いているものも多いが、ドラッグ&ドロップもできればユーザビリティは更に高くなる。ぜひとも実装して欲しいものだ(笑)(ドラッグ&ドロップできないものは意外と多い)。


(関連記事)
【VisualStudio】【C#】OpenFileDialog(ファイルを開くダイアログ)でファイル名を取得する
【VisualStudio】【C#】設定の保存と読み込みをする


category: VisualStudio

thread: プログラミング

janre: コンピュータ

tag: VisualStudioリファレンス 
tb: 0   cm: --

【VisualStudio】【C#】設定の保存と読み込みをする  


 大昔には ini ファイルなどにアプリの設定データを保存する機能を自分で実装してたものだが、幸い最近のアプリケーションフレームワークには初めから簡単にアプリのデータなどの保存・読み込みの行える機能が付いていることが多い。せっかくなので前回のコードに現在の状態の保存と読み込みを追加してみよう。具体的に言えば「アプリケーション終了時にテキストボックスの文字列を保存し、次回起動時にその文字列を復帰させる」ようにしてみよう。

 アプリの設定データなどを保存するには「Properties.Settings.Default.Save()」を使う。それでは実際にやってみよう。

(※) Visual Studio 2017 / Windows10(x64) で確認

 例えばコントロールに図のような名前が付いているとき、「閉じる」ボタンでアプリケーションが終了→テキストボックスの文字列を保存、次回起動時に保存された文字列が読み込まれ復活するようにしよう。その前に、保存用のプロパティを作っておこう。そのやり方とコードは以下のようになる。


●保存用のプロパティを作成

1.メニューから「プロジェクト>XXXのプロパティ」(XXXにはプロジェクトの名前が入る)でアプリケーションのプロパティを開く。



2.「設定」の項目を開き、保存用のプロパティを作成する。とりあえず名前と種類(型)を適当に作る。ここでは「textBoxInput」の文字列用を「InputFile」、「textBoxOutput」の文字列用を「OutputFile」とした(※コントロール名と同じにするのも良い)。



3.デザイン画面でフォーム(Form1)をクリックし、プロパティウィンドウでイベントに切り替え(雷アイコンを押す)、「FormClosing」が空欄だったらダブルクリックでイベントハンドラを作成する(ちなみに実装コードは「Form1.Designer.cs」を開いて「Windows フォームデザイナーで生成されたコード」を展開すれば「this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);」と書かれているのがわかる)。



4.アプリケーション終了のイベントハンドラ「Form1_FormClosing()」にプロパティ保存を、アプリケーション起動時のイベントハンドラ「Form1_Load()」にプロパティ読み込みのコードを書く。

 コードの例は以下を見て欲しい。

●プロパティをアプリケーション終了時に保存、起動時に読み込む
using System;
using System.Drawing;
using System.Windows.Forms;

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

private void Form1_Load(object sender, EventArgs e)
{
//設定の読み込み
textBoxInput.Text = Properties.Settings.Default.InputFile;
textBoxOutput.Text = Properties.Settings.Default.OutputFile;
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//設定の保存
Properties.Settings.Default.InputFile = textBoxInput.Text;
Properties.Settings.Default.OutputFile = textBoxOutput.Text;
Properties.Settings.Default.Save();
}

private void buttonClose_Click(object sender, EventArgs e)
{
Application.Exit(); //アプリ終了(※Form1_FormClosing() も呼び出される)
}
}
}

 アプリケーションの終了するには「Environment.Exit()」などもあるが、終了イベント(FormClosing)が発生しないので注意。保存のタイミングは「Properties.Settings.Default.Save()」を呼んだときになるので、ボタンのクリックイベント(Click)で呼び出しても良い。


(関連記事)
【VisualStudio】【C#】コードでアプリケーションを終了する / 終了コードを返す


category: VisualStudio

thread: プログラミング

janre: コンピュータ

tag: VisualStudioリファレンス 
tb: 0   cm: --

【VisualStudio】【C#】キャンセルボタン・デフォルト(アクセプト)ボタンを設定する  


 フォームアプリケーションなどではキャンセルボタン(Escキーでキャンセル)、デフォルト(アクセプト)ボタン(Enterキーで実行など)が設定されていると便利なことが多い。前回作った「ボタンを押してアプリケーションを終了」に設定してユーザビリティを上げてみよう(笑)。

 キャンセルボタンを設定するにはフォームの「Form.CancelButton」プロパティにコントロール名(ボタン)を選択すれば Escキーに紐付き、デフォルト(アクセプト)ボタンを設定するには「Form.AcceptButton」プロパティにコントロール名(ボタン)を選択すれば Enterキーに紐づく

(※) Visual Studio 2017 / Windows10(x64) で確認

 例えば図のような名前が付いているとき、Escキーで「閉じる」が実行されアプリケーションが終了、Enterキーが押されたとき何らかの処理が行われるとしよう。その場合、Form1 のプロパティウィンドウでの設定とコードは以下のようになる。



●Escキーでアプリケーション終了、Enterキーで実行されるコード
using System;
using System.Drawing;
using System.Windows.Forms;

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

private void Form1_Load(object sender, EventArgs e)
{
}

private void buttonClose_Click(object sender, EventArgs e)
{
Application.Exit(); //アプリケーション終了
}

private void buttonExecute_Click(object sender, EventArgs e)
{
//何らかの処理
Console.WriteLine("buttonExecute_Click");
}
}
}

 ちなみにボタンのクリックイベントはデザイン画面でボタンをダブルクリックするか、プロパティウィンドウのイベント(雷アイコンで切り替え)で「Click」の空欄をダブルクリックすれば、自動でコードが生成される(実装コードは「Form1.Designer.cs」を開いて「Windows フォームデザイナーで生成されたコード」を展開すれば「this.buttonExecute.Click += new System.EventHandler(this.buttonExecute_Click);」「this.buttonClose.Click += new System.EventHandler(this.buttonClose_Click);」と書かれているのがわかる)。

 「Form.AcceptButton」や「Form.CancelButton」は実行時にも変更できるので、例えば状態によって Enterキーで何が実行されると使いやすいか?なんてことを考えて、コントロールのフォーカス位置などで変更してあげると、ユーザビリティの高いアプリケーションになると思う。


 確か VisualStudio 6.0以前はボタン自体にプロパティがあったが、.NET以降はフォームで設定するようになったんだよね。たまに見つからなくて困る仕様変更の1つ(笑)。


(関連記事)
【VisualStudio】【C#】コードでアプリケーションを終了する / 終了コードを返す


category: VisualStudio

thread: プログラミング

janre: コンピュータ

tag: VisualStudioリファレンス 
tb: 0   cm: --

【VisualStudio】【C#】コードでアプリケーションを終了する / 終了コードを返す  


 フォームアプリケーションなどではボタンを押してアプリケーションを終了したいこともあるので念のため。

 コードでアプリケーションを終了するには「Application.Exit()」または「Environment.Exit()」メソッドを使う。使い分けというわけではないが、例えば Windowsアプリケーションのようにライフサイクルがあるものは「Application.Exit()」を、言語のみで使用する場合は「Environment.Exit()」を使うと考えても良い。実際にアプリケーションで「Environment.Exit()」を使ってみるとライフサイクルが実行されず終了してしまうので、「Application.Exit()」が使えるシステムなら通常終了に「Environment.Exit()」を使うのは避けたほうが無難だろう。以下に簡単な例を載せておこう。


(※) Visual Studio 2017 / Windows10(x64) で確認



■Application.Exit() で終了する

●閉じるボタンを押したとき、アプリケーションを終了する
using System;
using System.Drawing;
using System.Windows.Forms;

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

private void Form1_Load(object sender, EventArgs e)
{
}

private void buttonClose_Click(object sender, EventArgs e)
{
Application.Exit(); //アプリケーション終了
}
}
}

●例えば以下のような名前とするとき






 例えば「閉じる」ボタンの名前が「buttonClose」のとき、そのイベントハンドラ「buttonClose_Click()」(クリックイベント)に「Application.Exit()」を書いておけば、ライフサイクルも含めて正常に終了できる。

 ちなみにボタンクリックのイベントハンドラはデザイン画面でボタンをダブルクリックするか、プロパティウィンドウで「Click」イベントの空欄をダブルクリックすれば自動でコードが生成される(実装コードは「Form1.Designer.cs」を開いて「Windows フォームデザイナーで生成されたコード」を展開すれば「this.buttonClose.Click += new System.EventHandler(this.buttonClose_Click);」と書かれているのがわかる)。

 また、「Application.Exit()」をそのまま使った場合は終了コードは0(正常終了)になるので、エラーコードなどを与えたい場合は、「Environment.ExitCode」に int 値を代入しておけば、終了コードとして返せる

Environment.ExitCode = 1;   //終了コードなど
Application.Exit(); //FormClosing, FormClosed なども発生する


●Application.Exit() では終了イベント FormClosing, FormClosed も発生する




■Environment.Exit() で終了する

●終了コード 1 で終了する
using System;

public class Hello{
public static void Main(){
System.Console.WriteLine("Hello C#");
Environment.Exit(1); //終了コード1 で終了する
}
}

 こちらは「System」に組み込まれているものなので、フォームアプリケーション以外でも使用できる。引数の int 値は終了コード(エラーコード)になるが、正常終了した場合は通常0を与える。C言語の exit() みたいなものと考えても良いかも知れない。

 ただ注意して欲しいのは、Windows アプリケーションなどに使用する場合は、そのライフサイクルを無視してしまうので、自作アプリなどに使用する場合は前述した「Application.Exit()」を使った方が良いだろう。実際に前述のコードを「Environment.Exit()」で書き換えてみると、終了イベント「FormClosing」「FormClosed」が発生していないのがわかる。


●Environment.Exit() では終了イベント FormClosing, FormClosed は発生していない


 ちなみに終了イベント「FormClosing」「FormClosed」はデザイン画面でフォームをクリックし、プロパティウィンドウでイベントから「FormClosing」「FormClosed」の空欄をダブルクリックすれば自動でコードが生成される(実装コードは「Form1.Designer.cs」を開いて「Windows フォームデザイナーで生成されたコード」を展開すれば「this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);」「this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.Form1_FormClosed);」と書かれているのがわかる)。これらはフォームが閉じられる前と後で発生する感じだが、アプリの設定などを保存したい場合は「FormClosing」でやった方が良いだろう。ここでは「Console.WriteLine()」で文字列を出力しているだけだ。


●プロパティウィンドウ(イベントは雷アイコン)で空欄をダブルクリックすれば、自動でコードが生成される



(関連記事)
【VisualStudio】【C#】キャンセルボタン・デフォルト(アクセプト)ボタンを設定する


category: VisualStudio

thread: プログラミング

janre: コンピュータ

tag: VisualStudioリファレンス 
tb: 0   cm: --


プロフィール

Twitter

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop