質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

8288閲覧

システム終了時確認メッセージが2重に出てしまう C#

Mitz

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/11/20 04:10

###前提・実現したいこと
初心者です。
vidualStadio 2017 でスケジュールアプリを制作している。

フォーム内にシステム終了ボタンを設置した。
右上の×ボタンを押した時にもシステム終了をするようにした。(ログインフォームを出さないように。)
フォーム終了時にシステム終了と確認メッセージを出す処理をつけている。

システム終了時にも同じ処理を施しているが、システム終了ボタンを押した時に2重の確認になってしまうので
1度だけ確認すればアプリケーション終了できるようにしたい。

###該当のソースコード
C#
同フォーム内のコード

//システム終了ボタンクリック時の処理
private void BtnExit_Click(object sender, EventArgs e)
{
//ログイン情報ファイルの存在チェック
string path = Settings.GetSettingPath(); //ログイン情報ファイルへのパス

if (File.Exists(path) == true) { //CancelEventArgsオブジェクトの作成 System.ComponentModel.CancelEventArgs cea = new System.ComponentModel.CancelEventArgs(); //メッセージボックスを出して、OKの時システムを終了させる if (MessageBox.Show("本当に終了してもよろしいですか?

                    \r\n※このまま終了するとログイン情報は保持されます。", "終了確認",                              MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) == DialogResult.OK)
Application.Exit(cea);
}
}

//ログアウトボタンクリック時の処理
private void BtnLogout_Click(object sender, EventArgs e)
{
//ログイン情報を破棄する(ファイルを削除する)
File.Delete(Settings.GetSettingPath());

//ログイン画面へ移動 Close(); } //フォームの閉じる時の処理 private void Frm_BGMain_FormClosed(object sender, FormClosedEventArgs e) { //ログイン情報ファイルの存在チェック string path = Settings.GetSettingPath(); //ログイン情報ファイルへのパス if (File.Exists(path) == true) { //CancelEventArgsオブジェクトの作成 System.ComponentModel.CancelEventArgs cea = new System.ComponentModel.CancelEventArgs(); //メッセージボックスを出して、OKの時システムを終了させる if (MessageBox.Show("本当に終了してもよろしいですか?\r\n

                    ※このまま終了するとログイン情報は保持されます。", "終了確認",                                MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) == DialogResult.OK)
Application.Exit(cea);
}
}

###試したこと
フラグを立ててシステム終了ボタンを押した時はフォーム終了時の処理をさせないようにすればいいと、助言をもらったが
どのようにフラグを実装して、コードにすればいいのかわからない。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

コード読みにくいです。

インデントが無視されるので非常に読みにくい。

なので コードボタン ( "</>" とあるやつ ) をクリックしてその中にコードを記述するようにしてください。

質問についてですが、これは当たり前だと思います。

今回の場合は "BtnExit" ボタン? を押すと 確認ダイアログ ( メッセージボックス ) が開いて OK/キャンセル みたいな感じで聞いて、OKなら iniファイルみたいなのに書き込んで終了する...

っていうことがしたいのですよね?

ですが、質問のコードでは2回出てくるのは当たり前です。

BtnExitボタンが押された -> BtnExit_Clickイベントハンドラが起動 -> そのハンドラ内のApplication.Exit(cea);により Frm_BGMain_FormClosedイベントハンドラが呼ばれる ...

となっていると思います。

よって確認ダイアログが2回出てくるのは当たり前。

試しに BtnExit_Clickイベントハンドラと Frm_BGMain_FormClosedイベントハンドラにあるそれぞれの確認ダイアログの文言を変えてみてください。

2種類出ると思います。

たぶんこれが原因。

解決方法は私が思いつく方法だけ列挙しますね。

方法1: 素直に 一方だけに絞る 方法2: フィールドとして「終了許可」なるものを保持して、それがtrueのときに閉じる

方法2についてですが、

例えば bool closeKey をフィールドとして保持し、コンストラクタとかで falseにしておく。
( 閉じることを禁止にするため。 )

で、終了許可を出してもいいところ ( 今回だとBtnExit_Clickイベントハンドラ ) で closeKeyを trueに書き換える

で、Frm_BGMain_FormClosedイベントハンドラが呼ばれた場合、

このcloseKey が true のときは終了し、それ以外なら「終了許可が出ていません」みたいなダイアログを出す。 ( 出さなくてもいいが、一般ユーザは何らかのトラブル(クラッシュとか) かと勘違いする可能性があるため。 )

みたいな感じでやればいいと思う。

この考えは VBAをやっているときに知りました。

すぐマクさんをヒントにしました。

投稿2017/11/20 04:36

BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mitz

2017/11/20 05:15

この質問サイトの使いか方まで教えてもらいありがとうございます。 コードが見にくくて申し訳なかったです。今後気をつけます。 方法2を少し試してみたのですが、なんだかんだでよくわからなかったので (私の技術不足で)とりあえず、方法1のほうで使い勝手の様子を見ることにします。 迅速な対応をありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問