misc.log

日常茶飯事とお仕事と

イベント処理内でメッセージボックス表示するとメッセージ表示後に別フォームが前面に出てくる

職場での質問メモ。言語はC#

Grapecity(グレープシティ)のSpreadで、セル内の変更について「変更しますか?」というようなメッセージを出して可否を問うたあと、「いいえ」で戻ろうとするとそのフォームの親となるフォームが前面に飛び出してくるというトラブルが。

LeaveCellイベントに処理が書かれていて、「いいえ」の場合はLeaveをキャンセルする指定をしていたので、そのあたりの不具合なのかと思ったけれど、メッセージボックスでの問いかけを無くしてキャンセルだけにしてみたら現象は出ない。ということは「メッセージボックスが犯人」と思われます。

おそらく、メッセージボックスの表示でフォーム複数の表示順序が変わってしまうような事が起きるのだろうと思い、「messagebox form after display order changed」というキーワードでGoogle検索。出てきた結果がこれ。

social.msdn.microsoft.com

メッセージボックス表示後に、背後(underneath)にいたフォームがトップに出てきてしまうというもの。対応方法としてコメントがついている内容は

  • MessageBoxのオーバーロード引数でオーナーを指定するものがあるので、そこでthisを指定してみる(this=自分自身)。
  • そもそもメッセージ表示をClosing/Closed系のイベントに配置してみたら?

というもの。この場合、前者の「thisを指定」が有効でした。というか、間違えて「this.owner」が指定されていたため、自分の親フォームを土台としたメッセージを表示、メッセージが閉じたらその親である「1つ前のフォーム」が飛び出してくるというのが原因でした。

とりあえず、よく使うクラスやメソッドでも引数などの意味はきちんと理解して指定しようね、ということですね。

基礎からしっかり学ぶC#の教科書 マイクロソフト関連書

基礎からしっかり学ぶC#の教科書 マイクロソフト関連書