C#でForm1からForm2を表示する際の制御方法

このQ&Aのポイント
  • Form1からForm2を表示(Form2.Instance.Show();)したとき、Form2がForm1の上にこないように、また、Form2は必ずForm1のすぐ後ろであるようにする方法を知りたいです。
  • IEで検索ウィンドウを開いたときに、検索ウィンドウを表示していてもIEは操作できるけど(モードレス)、IEの後ろに検索ウィンドウが行くことはありません。このような制御をC#で実現する方法を教えてください。
  • Form1.Activateなどを使って無理やり制御しようとしましたが、うまくいきませんでした。どのようにすればForm2が常にForm1の後ろに表示されるようにできるのでしょうか?
回答を見る
  • ベストアンサー

【C#】Form1からForm2を表示したとき、Form2がForm1

【C#】Form1からForm2を表示したとき、Form2がForm1を所有する 検索しても見つからなかったので質問させていただきます。 Form1からForm2を表示(Form2.Instance.Show();)したとき、 Form2がForm1の上にこないように、また、Form2は必ずForm1のすぐ後ろであるようにして欲しいんです。 たとえば、 IEで検索ウィンドウを開いたときに、検索ウィンドウを表示していてもIEは操作できるけど(モードレス)、IEの後ろに検索ウィンドウが行くことはありません。 これはForm2.Instance.Show(this);とすればいいだけですが、 自分がやりたいのはその逆です。 検索ウィンドウの後ろにIEが行くことがないようにしたいんです。 Form1.Activateなどを使って無理やりさせようとしましたが、 無理だったので質問しました。 わかる方は教えていただけると嬉しいです。 お願いします。 (ちなみにVisualStudio2010、.NET Framework3.5です。)

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

すみません C#でしたね ^^ Form1側に Form2型の変数を用意します Form2 objForm2; 表示する際に if ( objForm2 == null || objForm2.IsDisposed )   objForm2 = new Form2(); this.Owner = objForm2; objForm2.Show(); Form2側のFormClosingイベントで if ( this.OwnedForms.Length != null ) {   this.OwnedForms[0].Owner = null; } といった具合になるかと ・・・

wararyo
質問者

お礼

思い通りにできました。ありがとうございました。 こんな簡単にできるとは…。

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

Form2の表示前に me.Owner = From2.Instance を実行すればご希望の動作になりそうです Form2側の FormClosingイベントで if Form1.Owner IsNot Nothing then   Form1.Owner = nothing End if を実行しないと Form2を閉じると Form1まで閉じてしまうと思います Form1からForm2を開く際には Locationを適切に設定しないとForm1の影に隠れてしまうと思います

関連するQ&A

  • 新しくform2を開いた時、呼び出した親のform1を最前面に表示したい。

    Form1から  Form2.Show 0, Me と、Form2を開きます。 この際、Showメソッドの書式  object.Show style, ownerform のstyleは0(モードレス)です。 この状態でデバッグモードにし、呼び出した元のForm1をクリックした時、Form1はアクティブになるのですがForm2の後ろに隠れて見えません。 Form1がForm2の後ろにあってもフォーカスが移動したら最前列に表示させることは出来ないでしょうか? ご存知の方々、どうかお知恵を貸してくださいm(_ _)m

  • [C#]FormクラスのShowメソッドの挙動について

    C#のSystem.Windows.Forms.FormクラスのShowメソッドについて調べています。 Showメソッドを使うことで、モードレスでフォームを表示できます。 http://msdn2.microsoft.com/ja-jp/library/39wcs2dh.aspx 例えば、ボタンがクリックされたときに、モードレスでフォームを表示する場合は、以下のようになると思います。 // ボタンがクリックされたときにコールされるメソッド private void button1_Click(object sender, EventArgs e) { MyForm form = new MyForm(); // MyFormはFormの継承クラス form.Show(); } このとき、button1_Clickメソッドが終了しても、 つまり、変数formのスコープから処理が外れても、MyFormは表示され続けます。 別スレッドで表示しているのかと思いましたが、MyFormを表示してもスレッド数は変わりませんでした。 なぜ、変数formのスコープから処理が外れても、MyFormが表示され続けるのかわかりません。 どなたかご存知の方がいらっしゃいましたら、ご教授いただけると幸いです。 環境 : WindowsXP SP2, .NET Framework 2.0, Visual Studio 2005

  • 別formの多重起動防止

    どうもお世話になってます。 visual C++/CLIでプログラミングしています。 ボタン1を押したら別のフォームをモードレスで 表示させたいのですが private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { Form2^ otherform = gcnew Form2(); otherform->Show(); } このようにした場合ボタンを押すたびに次々とフォームが 多重起動していきます。これを1つだけ表示させるように したいのですが… こちらのサイト http://dobon.net/vb/dotnet/form/singleform.html の方を参考にしてC++用に書き直してみたいのですが どのように書いたらよいか教えてもらえないでしょうか? よろしくお願いします。 自分は以下のように書き直してみたんですが 大量のエラーを吐き出してしまいました。 private: static Form2^ _instance; public:  static Form2 Instance{    get     {     if (_instance == null || _instance.IsDisposed)     _instance = gcnew Form2();     return _instance;     } } private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { Form2->Instance->show(); }

  • C# form

    Button _Button = (Button)sender; int but = 0; if (_Button.Name == "button1") { but = 1; } if (_Button.Name == "button2") { but = 2; } if (_Button.Name == "button3") { but = 3; }      //Form2クラスのインスタンスを作成する Form2 f2 = new Form2(this); //Form2を表示する //ここではモーダルダイアログボックスとして表示する ////オーナーウィンドウにthisを指定する //f.ShowDialog(this); //フォームが必要なくなったところで、Disposeを呼び出す f2.Show(); 上記のようにボタン配列を作成し,クリックイベントを発生させています.そこで押されたボタンにより butに所定の値を入れてこれを,form2において判断値として使用したいのですが,どのようにすれば 良いでしょうか? 昨日から悩んでいるのですが自分だけでは解らないのでご教示願いたいと思います.

  • C# Formの非アクティブ化をふせぎたい

    いつもお世話になっております。 メインのFormからサブFormをShow()で呼び出しています。 サブFormが表示された後、メインFormをクリックすると当然メインFormがアクティブになりますが、 ある条件下においてサブFormからぬけられなくしたいのですが、何か良い方法はありますか?

  • C# Formの操作

    Form2 form2 ; // 子 Form Form3 form3 ; // 子 Form private void button1_Click(object sender, System.EventArgs e) { form2 = new Form2() ; this.AddOwnedForm(form2) ; // 親 Form が form2 を所有する form2.Show() ; } private void button2_Click(object sender, System.EventArgs e) { form3 = new Form3() ; this.AddOwnedForm(form3) ; // 親 Form が form3 を所有する form3.Show() ; } 上記のようにボタン一つに対して1つのFormに対する処理をするのではなく,ボタン1つに対して 複数のFormを処理する.つまり 例えば,Form1,2,3とあったとして,Form1のボタンを押してFrom2を開き,そこで何らかの処理を したものをForm1に反映する.または,From3のボタンを押してForm2を開きそこで何らかの処理を 行いForm3に反映する. この場合,Form1とForm3のどちらのFormのボタンが押されたか判断しないといけないと思うのですが,ここの処理がうまくいきません. どちらかのFormのボタンを押してForm2を表示し,どちらかのFormに反映させる所までは出来たのですが,両方の判断材料を入れて,どちらのFormのボタンを押されたか判断する際に,押されなかった方が「null」となりエラーになります. 下記にこの判断部分を掲載いたします.どなたかご教授よろしくお願いいたします. Form1 public int but = 0; public int butt1; public string DB; public string HDB; public Form2 f2 = null; private void mybutton1_Click(object sender, EventArgs e) { butt1 = 1; ・ ・ ・ public int Ye=0; private void button43_Click(object sender, EventArgs e) { butt1 = 0; From2 public partial class Form2 : Form { Form1 f1; Form3 f3; public Form2(Form1 f) { f1 = f; // メイン・フォームへの参照を保存 InitializeComponent(); } public Form2(Form3 f) { f3 = f; // メイン・フォームへの参照を保存 InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { #region int Pin1 = f1.butt1; int Pin3 = f3.butt3; Form3 Form1と基本的には同じです.

  • VC++2005 Form1とForm2のデータのやりとり

    現在VC++2005でプログラムをしています。 そこでForm1で表示されているテキストボックスの中身をForm2のテキストボックスに表示するのはどのようにすればよいのでしょうか? ちなみに、Form2の表示は下記のプログラムで行っています。 ―Form1.hの内容― #include "Form2.h" Form2^ newMDIChild = gcnew Form2(); newMDIChild->Show(); ―Form2.hの内容― this->Hide(); というので表示を消しています。 初歩的な質問だと思いますがよろしくお願いします。

  • WindowsFormの消去について(C#)

    こんにちわ。 C#(WindowsForm)で以下のような処理を考えています。 1.起動するとForm1(ログイン画面)が開く 2-1.認証に成功 → 3へ 2-2.認証に失敗 → メッセージを表示し、ログイン画面のユーザ名にフォーカスをセット 3.Form3(メインメニュー)を開く そこで、スタートアップの画面は、Form1で良いと思うのですが、 2-1の場合に、以下のようなコードを書いてみました。 *************************************** Form3 f = new Form3(); f.ShowDialog(this); f.Dispose(); this.Close(); *************************************** これでは、次の部分で目的を達成できませんでした。 A.Form3をShowDaialog(this)で開くと、モーダルモードで開くだけとなってしまう。 Showではモードレスとなるだけ。 B.Dispose、Closeを記述してみたが、Form3が開いた時に、 画面上からForm1が消えるわけではない。 Closeでは、システム自体が終了してしまう。 そこで、ShowDialogやShowではなく、Form1を消し、Form3を表示するメソッド等あるのでしょうか? ちなみに、Form3をCloseした場合に、Form1を再度呼び出す処理は考えていません。

  • 【VB.NET2003】フォーム1を閉じてフォーム2を表示させたい

    プログラミング初心者でVB.NET2003使用です。 検索したところ、それらしいものがあったのでチャレンジしましたがダメだった(ちょっと違う?)ので質問させていただきます。 http://oshiete1.goo.ne.jp/qa1757174.html 《やりたい事》 Form1に配置したボタン1をクリックするとForm1を閉じてForm2を表示 Form2に配置したボタンAをクリックするとForm2を閉じてForm1を表示する。 これをやりたいのですが、なかなかうまく行きません。 ボタン1をクリックしてForm1を閉じないでForm2をShowかShowDialogでモードレス表示 ボタンAをクリックしてForm2をCloseさせてForm1を表示させる事(元々閉じていないので)は出来ます。 可能ならばどちらかを必ず閉じる方法でやりたいと思います。 可能でしょうか? 解決策やヒント、良いサイトがありましたら回答をお願いします。

  • C#で別スレッドからメインformをアクティブ化

    質問番号:7352165で質問中の者です。 デリゲートとInvokeを使ったスレッドでは、スレッド実行中にイベントが発生しないので止む無く直接スレッドを起動しているのですが、この方法ではメインformのTextBoxなどに直接アクセスできません。 それでアクセスするメソッドをデリゲート+Invokeで呼んでおり、TextBoxの表示は正常に動作していますが、フォーカスをメインformに移動させる為にActivate();メソッドを記述すると「フィールド初期化子は静的でないフィールド、メソッド、または……を参照できません」の記述エラーとなります。 あまり理解できていないので基本的な使い方が間違っているかも知れませんが、何か解決策があればお教え下さい。 public void FormActive()  ← メインform(fmTax)に記述 {   this.Activate(); } private delegate void ActivDelegate(); ← 別スレッドに記述 ActivDelegate activDelegate = delegate() {   fmTax.FormActive(); ← ここにエラー表示 };

専門家に質問してみよう