職場での質問メモ。言語はC#。
Grapecity(グレープシティ)のSpreadで、セル内の変更について「変更しますか?」というようなメッセージを出して可否を問うたあと、「いいえ」で戻ろうとするとそのフォームの親となるフォームが前面に飛び出してくるというトラブルが。
LeaveCellイベントに処理が書かれていて、「いいえ」の場合はLeaveをキャンセルする指定をしていたので、そのあたりの不具合なのかと思ったけれど、メッセージボックスでの問いかけを無くしてキャンセルだけにしてみたら現象は出ない。ということは「メッセージボックスが犯人」と思われます。
おそらく、メッセージボックスの表示でフォーム複数の表示順序が変わってしまうような事が起きるのだろうと思い、「messagebox form after display order changed」というキーワードでGoogle検索。出てきた結果がこれ。
メッセージボックス表示後に、背後(underneath)にいたフォームがトップに出てきてしまうというもの。対応方法としてコメントがついている内容は
- MessageBoxのオーバーロード引数でオーナーを指定するものがあるので、そこでthisを指定してみる(this=自分自身)。
- そもそもメッセージ表示をClosing/Closed系のイベントに配置してみたら?
というもの。この場合、前者の「thisを指定」が有効でした。というか、間違えて「this.owner」が指定されていたため、自分の親フォームを土台としたメッセージを表示、メッセージが閉じたらその親である「1つ前のフォーム」が飛び出してくるというのが原因でした。
とりあえず、よく使うクラスやメソッドでも引数などの意味はきちんと理解して指定しようね、ということですね。

- 作者: WINGSプロジェクト高江賢
- 出版社/メーカー: 日経BP社
- 発売日: 2018/02/06
- メディア: Kindle版
- この商品を含むブログを見る