none
ShowDialogで親の処理継続 RRS feed

  • 質問

  • c# で、フォームから、さらに子フォームを呼び出したときに、

    formchild.ShowDialog(this)として、モーダルフォームとしてオープンしたいのですが、
    親フォームはそのまま処理を継続(ただし親画面の操作は不可能)したいときは、
    どうしたらいいでしょう

    ShowDialogとした後、処理が止まってしまい(当たり前ですが・・)困り果てています

    2012年10月9日 8:06

回答

すべての返信

  • モーダレスでオープンしておいて、本体フォームの方は、this.Enabled = false にしておくというのではダメですか?

    • 回答としてマーク いちろう 2012年10月11日 5:14
    2012年10月9日 8:31
  • モーダルフォームを開いた後に継続したい処理とはどのようなものでしょうか? 時間がかからない処理であればその処理が終わってからモーダルフォームを開けば良いですし、時間のかかる処理であれば、モーダルダイアログが開いた後にブロックされるのはUIスレッドですから、その時間がかかる処理を別スレッドで動かしてしまえばよいのではないでしょうか?


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年10月9日 9:11
    モデレータ
  • 親フォームの処理は、UIスレッド上で動く必要のあるものでしょうか?もしそうではないのであれば、並列処理を検討してみてはいかがでしょう?

    ただ、処理内容にもよるので、必ずしも並列にするのが得策であるとは限りません。

    なお、ShowDialogで表示するダイアログは、UIスレッド上で動く必要があるので、現在親フォーム側で行っている(とまってしまう)処理を、並列化する必要があります。

    詳しくは、Sytem.Threading 名前空間や、System.Threading.Tasks 名前空間などを参照してください。.NET のバージョンや処理内容によって細かなやり方に違いはありますが、まずは単純な並列化を検討してもいいと思います。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    2012年10月9日 9:15
  • Enable=falseを試したところ薄くなってしまうのが嫌と言われてしまいました・・・

    ただ、こんな感じで回避できるのならばと、
    とりあえず、呼び出される側のフォームに、親フォームの参照をプロパティで設定して、
    継続したい親の関数を、ダイアログ内で参照から呼び出すという方法で、何とかなりました

    public FormOya{set m_frmOyaoya=value;}

    void thisfoo(){
    m_frmOyaoya.oyafoo();
    }

    ・・・というようなかんじです

    若干トリッキーではありますが、見た目はよさげだったので今のところこれで解決にしてしまいました

    他の方からも、スレッドにすれば等いただいたので、機会があればそちらも試してみたいと思います

    2012年10月11日 5:14
  • 若干トリッキーではありますが、見た目はよさげだったので今のところこれで解決にしてしまいました

    解決されて何よりですが、少し気になりました。

    トリッキーと書かれていますが、ダイアログが開いてから任意のタイミングでthisfooメソッドを実行するのであれば、トリッキーな感じはしません。
    #ちなみに、m_frmOyaoyaの型が書かれていませんが、型を固定しないためにインターフェース化したりイベント化したりすれば汎用性が上がります。しかし、必要が無いのに無理にすることはないでしょう。

    一方、ダイアログが開いた直後にthisfooメソッドを実行するのであれば、少しトリッキーな気がします。そのタイミングであれば、特別な事情が無い限り、ダイアログを開く前に親側で処理をするのが普通だと思うからです。

    トリッキーと書かれているので後者だと想像したのですが、であればもう少し他のやり方があるのかもしれないと気になったのでした。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年10月15日 1:05
    モデレータ