如何通过每个按钮切换form1和form2?

时间:2014-12-10 14:43:04

标签: c# winforms

我创建了一个名为form2的新表单。

我尝试在form1 init函数上使用新的form2。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace c_charp_multiform
{
    public partial class Form1 : Form
    {
        private Form2 form2;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Visible = false;
            form2 = new Form2();
            form2.Show();
        }
    }
}

我可以成功显示form2,但是我没有按下按钮切换到form1,因为form2没有form1的任何实例。

如何通过form2上的按钮更改回来?

现在是form2代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace c_charp_multiform
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Visible = false;
            //Don't know what to do next
        }
    }
}

非常感谢〜

2 个答案:

答案 0 :(得分:2)

您可以像这样将Form1传递给Form2。

public partial class Form2 : Form
{
    private Form1 m_frm

    public Form2(Form1 frm)
    {
        InitializeComponent();
        m_frm = frm;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.Visible = false;
        m_frm.Show();
        m_frm.Visible = true;
    }
}

答案 1 :(得分:0)

表格1:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace c_charp_multiform
{
    public partial class Form1 : Form
    {
        //要建立form2的變數,這樣才能產生能夠傳參數的form
        private Form2 form2;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //將form1隱藏
            this.Visible = false;
            //將form2給new出來,new的同時將自己的記憶體位置傳給form2
            //這樣到時候form2要切換回form1前就可以先設定要顯示form1
            form2 = new Form2(this);
            //顯示form2
            form2.Show();
        }
    }
}

表格2:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace c_charp_multiform
{
    public partial class Form2 : Form
    {
        private Form1 m_form1;
        //在建立form2時得到form1的記憶體位置,
        //這樣之後就可以改form1的參數,也就是將form1顯示出來
        public Form2(Form1 p_form1)
        {
            InitializeComponent();
            //將form1的記憶體位址存起來
            m_form1 = p_form1;
        }

        /***
         * 這個按鈕的主要供能是將form2切換回form1
         **/
        private void button1_Click(object sender, EventArgs e)
        {
            //將form2隱藏
            this.Visible = false;
            //顯示form1
            m_form1.Visible = true;
            //關閉form2
            this.Close();
        }

        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            //顯示form1
            //加這行的主要目的是避免使用者在form2時就將form2直接關閉,
            //而不是按了切換回form1的按鈕後才關閉,
            //因此這樣就會導致了form1還在隱藏而沒有被關閉的情況發生,但是也無法被控制。
            //以寫程式來說,再次編寫程式就會編譯失敗
            //以執行面來說,就會有多餘的process佔著cpu和記憶體空間,不划算。
            m_form1.Visible = true;
            //此時就可以關閉form1,當然沒有將form1切回visible也可以關閉,
            //只是少了form1跳出立刻消失的關閉動畫~XD
            m_form1.Close();
        }
    }
}