teratail header banner
teratail header banner
質問するログイン新規登録
C#

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

Q&A

解決済

1回答

2009閲覧

C# Windows FormsアプリケーションでモーダルのMessageBoxを連続表示しようとすると表示されない。

naitou

総合スコア141

C#

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

0グッド

0クリップ

投稿2023/06/08 08:14

0

0

実現したいこと

MessageBoxが表示される前に次のメッセージボックスを表示しようとすると、最後のMessageBoxしか表示されません。

モーダルのFormであれば表示されます。
なお実際に表示されるまでThread.Sleep(1)などで待てば表示されますが、
スリープ時間が短いと何個か表示されない時があります。

以下はそれぞれ5つのモーダルダイアログを表示するサンプルコードです。

Thread.Sleep(1000)などかなり余裕のある時間にするかMessageBoxをFormで自作すると回避可能ですが、
この現象に知見があれば回答をお願いします。

該当のソースコード

//最後のダイアログしか表示されない。 private void button1_Click(object sender, EventArgs e){ Task.Run(() => { for (int i = 0; i < 5; i++){ int a = i; BeginInvoke((MethodInvoker)(() => { MessageBox.Show(this, a + ""); })); }; }); } //MessageBoxではなくFormなら表示できる。 private void button2_Click(object sender, EventArgs e){ Task.Run(() => { for (int i = 0; i < 5; i++){ int a = i; BeginInvoke((MethodInvoker)(() => { var form = new Form(); form.Text = a + ""; form.ShowDialog(); })); }; }); } //BeginInvokeの前にスリープを入れるとすべて表示されるが、スリープ時間が短いと何個か表示されない時がある。 private void button3_Click(object sender, EventArgs e){ Task.Run(() => { for (int i = 0; i < 5; i++){ Thread.Sleep(1); int a = i; BeginInvoke((MethodInvoker)(() => { MessageBox.Show(this, a + ""); })); }; }); }

補足情報(FW/ツールのバージョンなど)

.NET Framwork 4.8 Windows Formsアプリケーション

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2023/06/13 06:11 編集

あなたの言う「モーダル」って何なのでしょう? 普通モーダルと言うと複数開くものではないはずですけど。
naitou

2023/06/08 13:09

親ウィンドウを操作できなくする子ウィンドウです。普通に複数開けるものだと思っていました。
退会済みユーザー

退会済みユーザー

2023/06/09 01:21

> 親ウィンドウを操作できなくする子ウィンドウ であれば、複数開いたりするものではないと思いますけど。また、UI スレッドではないスレッドプールスレッド(メッセージループを持たない)で MessageBox.Show するというのは、どういう意図があるのでしょうか?  そもそも何がしたいのですか? XY 問題のような気がしますけど。 XY 問題とは、X という課題があって、Y という解決策を考えついて Y について質問したが(質問には X は書かないで)、Y は X の解決策とはなっておらず、回答者と質問者間で話がかみ合わず、一向に解決にならないということです。
naitou

2023/06/09 01:59

BeginInvokeによりUI スレッドでMessageBox.Showをしています。 課題はこの現象に知見のある方へ解決方法があるか質問させていただいております。
episteme

2023/06/09 02:17

> 親ウィンドウを操作できなくする子ウィンドウです。 「閉じるまで(親に限らず)他のウィンドウ操作できないウィンドウ」じゃなくて? そうであるなら複数開ける意味はなくなるかと。
Zuishin

2023/06/13 01:19

モーダルウィンドウはユーザーに最優先で決済してほしいものを提示するもので複数開くものではありませんが、どこかでそんな UI を見たんでしょうか? 何に便利なんですかそれ?
naitou

2023/06/13 03:28

すでに存在するシステムでそのような仕様があり不備を修正したいだけです。
Zuishin

2023/06/13 03:30

「そのような仕様」と「不備」と「修正」の意味がわかりません。 モーダルダイアログを一つだけ開くと言うのは不備でもなんでもないですが、何を不備と言っていますか?
退会済みユーザー

退会済みユーザー

2023/06/13 03:59

> すでに存在するシステムでそのような仕様があり不備を修正したいだけです。 MessageBox を同時に複数開くことが「不備」です。「不備を修正したい」ならそこを修正するのが筋では?
naitou

2023/06/13 04:02

タイミングによって複数のモーダルダイアログがネストされて表示される場合と最後のものだけ表示される場合があり不定であることを不備と表現しました。
naitou

2023/06/13 04:04

MessageBox を同時に複数開くことが「不備」という発想はありませんでしたが、解決方法が無さそうななので1つづつ開くように改修予定です。
退会済みユーザー

退会済みユーザー

2023/06/13 04:12 編集

> タイミングによって複数のモーダルダイアログがネストされて表示される場合と最後のものだけ表示される場合があり不定であることを不備と表現しました。 そういうのは不備とは言いません。そもそもMessageBox を複数開くことはあり得ないのだから。 強いて言うならあなたの考えの不備です。そこをいろいろ言われて取り繕うのは止めましょう。指摘されたら素直に認めてあなたの考えを修正してください。でないと話をしても時間の無駄になります。
naitou

2023/06/13 04:15

よろしければ、「MessageBox を複数開くことはあり得ない」とおっしゃれられる根拠がございましたら、教えて頂けますでしょうか。
Zuishin

2023/06/13 04:15

モーダルダイアログを開き、そこから別のモーダルダイアログを開くようにネストしたいのであれば、ダイアログ自体を自分で設計するのが普通のやり方です。 一つのウィンドウから複数のモーダルダイアログを開くような特殊な UI はユーザーも戸惑うでしょう。
Zuishin

2023/06/13 04:17

> よろしければ、「MessageBox を複数開くことはあり得ない」とおっしゃれられる根拠がございましたら、教えて頂けますでしょうか。 メッセージボックスはユーザーに最優先で伝えたいことを伝え、それを確実に伝えたことを確認して次の処理に移るための UI です。 複数のメッセージを表示したいだけならトーストを使いましょう。
naitou

2023/06/13 05:45

ありがとうございました。本質問は解決とさせていただきます。
guest

回答1

0

自己解決

メッセージボックスはユーザーに最優先で伝えたいことを伝え、それを確実に伝えたことを確認して次の処理に移るための UI であるため、複数のメッセージを表示したいだけならトーストを使うべきであるため、MessageBox を複数開くことはあり得ないとのことです。

投稿2023/06/13 05:45

naitou

総合スコア141

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問