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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.78099 の関連記事表示

<< 0 >>
■78099  子フォームで親フォームを閉じる
□投稿者/ SVO -(2015/12/14(Mon) 14:46:02)

    分類:[C#] 

    C#初心者なのですが、Form1のbutton1をクリックするとForm1が消えForm2が表示されます。
    Form2にあるbutton2をクリックするとForm2が消えForm3が表示されます。
    Form3の中にあるbutton1をクリックするとForm3が残ったままForm4が表示されます。
    そこでForm4のbutton1をクリックするとForm4とFrom3が消え、Form2が表示されるようにしたいです。
    どのようにすればいいのか全くわかりません...。
    よろしかったら教えてください...。
親記事 /過去ログ132より / 関連記事表示
削除チェック/

■78103  Re[1]: 子フォームで親フォームを閉じる
□投稿者/ 774RR -(2015/12/14(Mon) 15:40:22)
    インストーラ等でよくある *Next->* ボタンを押すと次の画面に移る Wizard 方式
    つまり「各 Form は対等で、単に順序があるだけ」なのか、

    そうでないのであれば「親子であるとは何か」の定義をしないと話が進まないよ。

    ってか、その文書では「やりたいこと」の解説が読者に(少なくともオイラには)通じない。
    各 Form に「親子」関係があるようには読み取れない。
記事No.78099 のレス /過去ログ132より / 関連記事表示
削除チェック/

■78104  Re[2]: 子フォームで親フォームを閉じる
□投稿者/ とっちゃん -(2015/12/14(Mon) 16:34:11)
    No78099 (SVO さん) に返信
    > C#初心者なのですが、Form1のbutton1をクリックするとForm1が消えForm2が表示されます。
    初心者ということなので、手間が少ない例を挙げておきます。


    Form1.button1 のボタンハンドラ(クリックイベントをハンドル。以下同様なので省略)
    まず、自分自身を非表示(Hideメソッドの呼び出しで実現可能)にします。
    Form2 のローカルインスタンスを作って、ShowDialog でモーダル表示します。
    ShowDialog から帰ってきたら、プログラムを終了する場合は
    自分自身のウィンドウを閉じます(Closeメソッドを呼び出し)。
    再び表示する場合は、自分自身を表示(Showメソッドを呼び出し)します。

    > Form2にあるbutton2をクリックするとForm2が消えForm3が表示されます。
    Form1の場合と同様です。
    Form3 のShowDialogから帰ってきたら自分自身を表示します。

    > Form3の中にあるbutton1をクリックするとForm3が残ったままForm4が表示されます。
    Form4を作成し、ShowDialog() します。
    ShowDialog() から帰ってきたら自分自身のウィンドウを終了します。

    > そこでForm4のbutton1をクリックするとForm4とFrom3が消え、Form2が表示されるようにしたいです。
    自分自身をクローズします。


    > どのようにすればいいのか全くわかりません...。
    > よろしかったら教えてください...。

    あえてコードは載せていませんが、入門書籍を一冊読破している程度の知識があれば
    わかる程度には書いてあると思います。

    わからない場合は、まずは入門書籍を一冊読んでみてください。

    本の読みやすさなどは人それぞれなので、これなら読めそうだというものを探してみてください。
    雑誌やWebサイトなどの入門シリーズみたいなものでもOKです。
記事No.78099 のレス /過去ログ132より / 関連記事表示
削除チェック/

■78105  Re[3]: 子フォームで親フォームを閉じる
□投稿者/ SVO -(2015/12/14(Mon) 16:56:20)
    No78104 (とっちゃん さん) に返信
    > ■No78099 (SVO さん) に返信
    >>C#初心者なのですが、Form1のbutton1をクリックするとForm1が消えForm2が表示されます。
    > 初心者ということなので、手間が少ない例を挙げておきます。
    >
    >
    > Form1.button1 のボタンハンドラ(クリックイベントをハンドル。以下同様なので省略)
    > まず、自分自身を非表示(Hideメソッドの呼び出しで実現可能)にします。
    > Form2 のローカルインスタンスを作って、ShowDialog でモーダル表示します。
    > ShowDialog から帰ってきたら、プログラムを終了する場合は
    > 自分自身のウィンドウを閉じます(Closeメソッドを呼び出し)。
    > 再び表示する場合は、自分自身を表示(Showメソッドを呼び出し)します。
    >
    >>Form2にあるbutton2をクリックするとForm2が消えForm3が表示されます。
    > Form1の場合と同様です。
    > Form3 のShowDialogから帰ってきたら自分自身を表示します。
    >
    >>Form3の中にあるbutton1をクリックするとForm3が残ったままForm4が表示されます。
    > Form4を作成し、ShowDialog() します。
    > ShowDialog() から帰ってきたら自分自身のウィンドウを終了します。
    >
    >>そこでForm4のbutton1をクリックするとForm4とFrom3が消え、Form2が表示されるようにしたいです。
    > 自分自身をクローズします。
    >
    >
    >>どのようにすればいいのか全くわかりません...。
    >>よろしかったら教えてください...。
    >
    > あえてコードは載せていませんが、入門書籍を一冊読破している程度の知識があれば
    > わかる程度には書いてあると思います。
    >
    > わからない場合は、まずは入門書籍を一冊読んでみてください。
    >
    > 本の読みやすさなどは人それぞれなので、これなら読めそうだというものを探してみてください。
    > 雑誌やWebサイトなどの入門シリーズみたいなものでもOKです。
    >
記事No.78099 のレス /過去ログ132より / 関連記事表示
削除チェック/

■78179  Re[1]: 子フォームで親フォームを閉じる
□投稿者/ omi-z -(2015/12/18(Fri) 23:14:11)
    No78099 (SVO さん) に返信

    子フォームを閉じたとき、親フォームも閉じる処理について、
    こんなサイトがありました。
    子フォームをメンバ変数として持っておくと、子フォームのイベントを親フォームで捕まえることができるみたいです。
    http://windyrings.jugem.jp/?eid=849

    入門書にのってるんですかね。僕も初心者なのですが、僕が持っている本には載ってなかった。
記事No.78099 のレス /過去ログ132より / 関連記事表示
削除チェック/

■78225  Re[1]: 子フォームで親フォームを閉じる
□投稿者/ Jitta -(2015/12/24(Thu) 22:08:29)
    No78099 (SVO さん) に返信
    やりたいことがはっきりしているのだから、それをコードに翻訳すれば良いだけなんだけど。
    
    Form1.button1 をクリックしたときに、Form2 を表示したい。
    →
    Form1 に Button を配置し、それを button1-1 と名付ける。
    button1-1 のクリックイベントを書く。
    void button1-1_clicked(object sender, EventArgs e)
    {
        Form2 を表示する
        このフォームを消す→this.Hide(); // Close にすると、アプリケーションが終了する(はず)
    }
    
    ここで、「Form2 を表示する」をどうするか。単純には、こうする。
    →
    new Form2().Show();
    
    これを続けると、Form4 で困る。
    
    void button4-1_Click(object sender, EventArgs e)
    {
        Form3 を非表示にする
        Form1 を表示する
        this.Close();
    }
    
    ここで、Form1, Form3 が参照できない。
    Form2 の様に「new Form1().Show();」とすると、Form4 から表示する Form1 は、最初に表示したものとは異なる。
    同様の理由で、既にある Form3 を閉じることができない。
    参照できないのは、参照できるところに置いていないから。
    だったら、参照できるところに置けば良い。
    方法はいくつかあり、単純な方法は、「教えてやる」こと。
    →
    class Form2
    {
        public Form ParentForm
        {
            get;
            set;
        }
    }
    としておいて、
    void button1-1_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2();
        f2.ParentForm = this;
        f2.Show();
        this.Hide();
    }
    
    ただし、Form2 については、Form3 だけではなく、Form4 まで教えなければならない。
    じゃぁ、Form4 には GrandParentForm プロパティを作るのか?
    それは面倒くさい。
    フォームを表示する順番が変わったり、表示非表示が変わったりしたら、変更量が大変なことになる。
    参照できるところに、プログラム中に使用する Form の配列があったらどうか。
    こんな風に書くことができる。
    →
    void button4-1_Click(object sender, EventArgs e)
    {
        formArray[2].Hide();
        this.Close();
        formArray[1].Show();
    }
    
    しかし、C# では、C/C++ のような、グローバル変数を宣言することはできない。
    なので、Form の配列を提供するクラスを作って、そのインスタンスを1つに制限してやる。
    インスタンスが複数あると、管理しているものとは違うリストを参照してしまうかもしれないからね。
    →
    class FormSore
    {
        // これが参照できるただ1つのインスタンス。
        private static FormStore instance = new FormStore();
        private List<Form> FormList
        {
            get;
            private set;
        }
        // コンストラクタを private にして、他からインスタンスを作らせない。
        private FormStore()
        {
            this.FormList = new List<Form>();
        }
        // ただ1つのインスタンスを参照するためのメソッド。
        public static FormSotore GetInstance()
        {
            return FormStore.instance;
        }
    }
    
    プログラムの開始時に、Form のインスタンスをこのリストに登録してやる。
    →
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        FormStore sotore = FormStore.GetInstance();
        store.FormList.Add(new Form1());
        store.FormList.Add(new Form2());
        store.FormList.Add(new Form3());
        store.FormList.Add(new Form4());
        Application.Run(store.FormList[0]);
    }
    
    これで、各ボタンの処理は、希望する処理のままに書ける。
    void button1-1_Click(...)
    {
        this.Hide();    // Form1が消え
        FormStore.GetInstance().FormList[1].Show(); // Form2が表示されます。
    }
    void button2-1_Click(...)
    {
        this.Hide();    // Form2が消え
        FormStore.GetInstance().FormList[2].Show(); // Form3が表示されます。
    }
    void button3-1_Click(...)
    {
        FormStore.GetInstance().FormList[3].Show(); // Form4が表示されます。
    }
    void button4-1_Click(...)
    {
        this.Hide();    // Form4と
        FormStore.GetInstance().FormList[2].Show(); // Form3が消え
        FormStore.GetInstance().FormList[1].Show(); // Form2が表示されます。
    }
    
    これで、書かれていることは満足するのだけれど、終わりではない。
    フォーム右上の×ボタンをクリックすると Close してしまう。
    Show/Hide で制御したいので、勝手に「消去」されないように、「消去」時には「非表示」になるように変える。
    →
    // これを、Form1 以外に実装する。
    public Form2()
    {
        InitializeComponent();
        this.FormClosing += Form2_FormClosing;
    }
    void Form2_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (e.CloseReason == CloseReason.UserClosing)
        {
            // ユーザーが閉じようとしたときに、「戻る」扱いとする。
            // Form1 を表示して、
            FormStore.GetInstance().FormList[0].Show();
            // このフォームを「閉じる」イベントはキャンセルして、
            e.Cancel;
            // 非表示にする。
            this.Hide();
        }
    }
    
記事No.78099 のレス /過去ログ132より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -