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

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

ただいまの
回答率

91.35%

  • C#

    4755questions

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

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

解決済

回答 1

投稿 2017/11/20 13:10

  • 評価
  • クリップ 0
  • VIEW 69

mitsuaki000

score 4

前提・実現したいこと

初心者です。
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);                
}
}

試したこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

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 13:36

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/20 14:15

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

    キャンセル

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

ただいまの回答率

91.35%

関連した質問

同じタグがついた質問を見る

  • C#

    4755questions

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