none
親フォームから切り離した子フォームを再度親フォームに接続する方法 RRS feed

  • 質問

  • やりたいことは、件名の通りです。

    親フォームの中で、子フォームを生成し、MdiParentをnullに設定すると、

    親から独立した子フォームを作ることができますが、

    その独立した子フォームを再度親に結びつけることは可能でしょうか。

     

    独立した子フォームを検索することが出来れば、MdiParentに親フォームを設定すれば

    いけそうな感じはしているのですが、甘いでしょうか。

    独立した子フォームにしても、親フォームを閉じると子フォームも一緒に閉じるので

    親と子はどこかに血のつながりがあると考えています。

    今のところ、親と子を結びつける方法は、親側でも子側でもどちらでも良いと考えています。

     

    親と子フォームを自由自在に脱着する方法を是非教えて下さい。

     

    宜しくお願い致します。

    2007年10月5日 9:33

回答

  • 返答が遅れまして、申し訳ありません。

    返信ありがとうございます。

     

    仰る通り、メンバにフォームの配列を用意して、その配列で管理すればやりたいことが実現できました。

    ありがとうございました。

     

    アドバイス頂いた管理の方法以外に、特定のメソッドを利用して管理しなくても良い方法が無いものか

    色々調べてみたのですが、Application.OpenFormsを利用すると、自アプリで開かれているフォーム(親フォーム含む)を

    すべて取得できることが分かりました。

    実際に組み込んでみたのですが、子フォームの切り離し有無関係なく、すべての子フォームを取得することができました。

    (親フォームが含まれるので、親を除く仕組みは必要ですが)

    更に、親フォームから切り離されたフォーム(MdiParent=null)に親を設定しようと試みたのですが、下記の方法だと例外が発生し、正常に処理できませんでした。

     

    コード ブロック

     foreach ( Form form in Application.OpenForms )
     {

    if( 親ウィンドウだったら)

    continue;

     

    form.MdiParent = 親フォーム;

     }

     

     

    原因は恐らく、ループ中にコレクションに対して変更を加えているためです。

    仕方なく、OpenFormsで取得した子ウィンドウを一旦別配列に格納しておき、その後にその配列をループし、

    親を設定するように変更しました。

     

    コード ブロック

    FormCollection formList = new FormCollection();

    foreach ( Form form in Application.OpenForms )

    {

       if ( 親ウィンドウだったら )
          continue;

         

       formList.Add( form);
    }

     

    foreach ( Form form in formList )
    {
       form.MdiParent = this;
    }

     

     

    2007年10月18日 3:00

すべての返信

  • 試していませんが、MidParent を null にする際に、その子フォームの参照をどっかにとっておいて(親フォームのメンバでもよいし、グローバル的なとこでも)、それを使えば良いのではないでしょうか?

     

    2007年10月5日 10:04
  • 返答が遅れまして、申し訳ありません。

    返信ありがとうございます。

     

    仰る通り、メンバにフォームの配列を用意して、その配列で管理すればやりたいことが実現できました。

    ありがとうございました。

     

    アドバイス頂いた管理の方法以外に、特定のメソッドを利用して管理しなくても良い方法が無いものか

    色々調べてみたのですが、Application.OpenFormsを利用すると、自アプリで開かれているフォーム(親フォーム含む)を

    すべて取得できることが分かりました。

    実際に組み込んでみたのですが、子フォームの切り離し有無関係なく、すべての子フォームを取得することができました。

    (親フォームが含まれるので、親を除く仕組みは必要ですが)

    更に、親フォームから切り離されたフォーム(MdiParent=null)に親を設定しようと試みたのですが、下記の方法だと例外が発生し、正常に処理できませんでした。

     

    コード ブロック

     foreach ( Form form in Application.OpenForms )
     {

    if( 親ウィンドウだったら)

    continue;

     

    form.MdiParent = 親フォーム;

     }

     

     

    原因は恐らく、ループ中にコレクションに対して変更を加えているためです。

    仕方なく、OpenFormsで取得した子ウィンドウを一旦別配列に格納しておき、その後にその配列をループし、

    親を設定するように変更しました。

     

    コード ブロック

    FormCollection formList = new FormCollection();

    foreach ( Form form in Application.OpenForms )

    {

       if ( 親ウィンドウだったら )
          continue;

         

       formList.Add( form);
    }

     

    foreach ( Form form in formList )
    {
       form.MdiParent = this;
    }

     

     

    2007年10月18日 3:00