C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

form間のイベントハンドラについて

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■89792 / inTopicNo.1)  form間のイベントハンドラについて
  
□投稿者/ usushio (1回)-(2018/12/27(Thu) 11:48:52)

分類:[C#] 

VisualStudio2017、C#でおこなっています。

MainForm と SubForm1〜4 があり、MainForm には 各SubForm に対応した button を配置しています。
この状態から、SubForm が常に一つしか開かないプログラムを作成したいと思っております。
各SubForm は、モードレスで表示しています。

例えば
button1 を押して SubForm1 を開く
次に button 2を押して SubForm2 が開いたら、SubForm 1は閉じる。
このような動きを作りたいのですが、
どうやって別の SubForm が開いているのかを判断したらよいのかがわかりません。
引用返信 編集キー/
■89793 / inTopicNo.2)  Re[1]: form間のイベントハンドラについて
□投稿者/ shu (1160回)-(2018/12/27(Thu) 11:59:18)
No89792 (usushio さん) に返信

SubFormのインスタンスを保持する変数(MainFormクラスのprivate)を用意し

(1)変数に値が設定されていたらそのFormを閉じ、変数をクリア
(2)該当SubFormを表示
(3)表示したSubFormのインスタンスを変数に設定

のように処理されるとよいと思います。
ただしSubFormがいつも終了可能な状態か分からないので、
閉じる前に状態確認をするようにされた方がよいと思います。(SubFormのPublicメソッドによる)
引用返信 編集キー/
■89794 / inTopicNo.3)  Re[2]: form間のイベントハンドラについて
□投稿者/ usushio (3回)-(2018/12/27(Thu) 13:29:28)
ありがとうございます。

始めたばかりで、道筋の立て方がわからず困っていました。

一度、組んでみます。
引用返信 編集キー/
■89795 / inTopicNo.4)  Re[2]: form間のイベントハンドラについて
□投稿者/ usushio (4回)-(2018/12/27(Thu) 15:28:27)
No89793 (shu さん) に返信
> ■No89792 (usushio さん) に返信
>
> SubFormのインスタンスを保持する変数(MainFormクラスのprivate)を用意し


これを参考にして、MainFormに
private Form_Main form_Main = new Form_Main();

でインスタンスを作成しました。

SubFormの保持されるためのインスタンスはどのように書けばよいでしょうか。

引用返信 編集キー/
■89796 / inTopicNo.5)  Re[3]: form間のイベントハンドラについて
□投稿者/ Hongliang (734回)-(2018/12/27(Thu) 15:40:25)
> これを参考にして、MainFormに
> private Form_Main form_Main = new Form_Main();
> 
> でインスタンスを作成しました。
なにかちょっと勘違いされているような。
簡単のためにSubFormを2つだけで考えた場合、以下のような感じです。
class MainForm {
    private SubForm1 sub1;
    private SubForm2 sub2;
    private void OnClick1(...) {
        if (sub2 != null) {
            sub2.Close(); // 問答無用でCloseしていいかどうかは仕様次第
            sub2 = null;
        }
        sub1 = new SubForm1();
        sub1.Show();
     }
}

引用返信 編集キー/
■89797 / inTopicNo.6)  Re[3]: form間のイベントハンドラについて
□投稿者/ 774RR (652回)-(2018/12/27(Thu) 15:51:13)
new Form_Main() を自分で実行するということは
Designer が new して画面に表示しているフォームとは別のフォーム画面を作っているということなので
それはたぶんやりたいこととは違うっす。
そもそも Form1 は既にあるので new して保持すべきは子フォームのみのはず。

閉じた Form の再利用は面倒なので Visible だけ操作すればそれっぽく動作して見えるはず

--Form1.cs--
public partial class Form1 : Form
{
    private FormSub1 formSub1;
    private FormSub2 formSub2; ...
    // コンストラクタでやるか Load でやるか他の場所でやるかは設計方針次第
    private void Form1_Load(object sender, EventArgs e)
    {
        formSub1 = new FormSub1();
        formSub2 = new FormSub2();
    }
    // ボタン1
    private void button1_Click(object sender, EventArgs e)
    {
        formSub2.Visible = false; // 他も
        formSub1.Visible = true;
    }
    // ボタン2
    private void button2_Click(object sender, EventArgs e)
    {
        formSub1.Visible = false; // 他も
        formSub2.Visible = true;
    }

}

子フォームを操作員が手で閉じちゃうといろいろ問題が発生するけど、それは後の課題ってことで。

引用返信 編集キー/
■89798 / inTopicNo.7)  Re[4]: form間のイベントハンドラについて
□投稿者/ usushio (5回)-(2018/12/27(Thu) 15:53:51)
完全に勘違いしておりました。

至らない点が多く、申し訳ありません。
大変感謝しております。



解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ