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

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

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

Re[1]: 子フォームで親フォームを閉じる


(過去ログ 132 を表示中)

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

■78099 / inTopicNo.1)  子フォームで親フォームを閉じる
  
□投稿者/ SVO (1回)-(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が表示されるようにしたいです。
どのようにすればいいのか全くわかりません...。
よろしかったら教えてください...。
引用返信 編集キー/
■78103 / inTopicNo.2)  Re[1]: 子フォームで親フォームを閉じる
□投稿者/ 774RR (352回)-(2015/12/14(Mon) 15:40:22)
インストーラ等でよくある *Next->* ボタンを押すと次の画面に移る Wizard 方式
つまり「各 Form は対等で、単に順序があるだけ」なのか、

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

ってか、その文書では「やりたいこと」の解説が読者に(少なくともオイラには)通じない。
各 Form に「親子」関係があるようには読み取れない。

引用返信 編集キー/
■78104 / inTopicNo.3)  Re[2]: 子フォームで親フォームを閉じる
□投稿者/ とっちゃん (315回)-(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です。

引用返信 編集キー/
■78105 / inTopicNo.4)  Re[3]: 子フォームで親フォームを閉じる
□投稿者/ SVO (3回)-(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です。
>
引用返信 編集キー/
■78179 / inTopicNo.5)  Re[1]: 子フォームで親フォームを閉じる
□投稿者/ omi-z (3回)-(2015/12/18(Fri) 23:14:11)
No78099 (SVO さん) に返信

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

入門書にのってるんですかね。僕も初心者なのですが、僕が持っている本には載ってなかった。

引用返信 編集キー/
■78225 / inTopicNo.6)  Re[1]: 子フォームで親フォームを閉じる
□投稿者/ Jitta (166回)-(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();
    }
}

引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -