close

C#多個Form視窗切換有三種方法:

1.將要顯示的Form的Visiable設為true,然後將其餘Form的Visiable設為false。

2.使用Form的Show

3.使用Form的ShowDialog

 

 

在說三種方法之前,先開個新的C# Windows Form Project

 

之後在右邊的方案總管,找個空的地方點選滑鼠右鍵→加入→新增項目

 

之後在Form1放上一些元件做為測試使用,而這些元件的Name都使用預設值(也就是button1、textbox1)

 

Form2也一樣

 

Form1的textbox1和Form2的button1、button2是給第三種方法測試使用的,另外兩種方法用不到

 

 

 

第一種方法、

對Form1的button1雙擊,之後開始編寫如下的程式碼


using System.Windows.Forms;

namespace Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //當按鈕被按下時
        private void button1_Click(object sender, System.EventArgs e)
        {
            Form2 f = new Form2();//產生Form2的物件,才可以使用它所提供的Method

            this.Visible = false;//將Form1隱藏。由於在Form1的程式碼內使用this,所以this為Form1的物件本身
            f.Visible = true;//顯示第二個視窗
        }
    }
}


然後Form2的程式碼可以寫或不寫(要寫也是同Form1的方式,只是改成將自己隱藏並且顯示Form1)

使用這種方法的缺點:

1.物件只是隱藏,並沒有關閉,所以還是會占用記憶體。

2.若使用者切換成新的視窗後,將新出來的視窗關閉,則原先的視窗會繼續隱形。

 

 

 

第二種方法、

對Form1的button1雙擊,之後開始編寫如下的程式碼


using System.Windows.Forms;

namespace Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //當按鈕被按下時
        private void button1_Click(object sender, System.EventArgs e)
        {
            Form2 f = new Form2();//產生Form2的物件,才可以使用它所提供的Method
            f.Show(this);//設定Form2為Form1的上層,並開啟Form2視窗。由於在Form1的程式碼內使用this,所以this為Form1的物件本身
            
            /* 下面這段程式碼的用處在於是否要將Form2始終顯示在Form1上面。
             * f.TopMost
               其為布林值,true代表要始終顯示在上面;false代表Form1可以在Form2上面,預設為true。*/

        }
    }
}


Form2則不用編寫任何程式碼,保持預設值即可。

使用這種方法的缺點:

1.由於可以越過Form2直接點選Form1,將造成使用者可以重複點選Form1的按鈕,不斷的開啟新的Form2

 

 

 

第三種方法、

這個方法可以傳回使用者在新的表單做了哪些事情...

對Form1的button1雙擊,之後開始編寫如下的程式碼


using System.Windows.Forms;

namespace Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //當按鈕被按下時
        private void button1_Click(object sender, System.EventArgs e)
        {
            textBox1.Text = "";//先清空textbox1的文字

            Form2 f = new Form2();//產生Form2的物件,才可以使用它所提供的Method
            f.ShowDialog(this);//設定Form2為Form1的上層,並開啟Form2視窗。由於在Form1的程式碼內使用this,所以this為Form1的物件本身

            if (f.DialogResult == System.Windows.Forms.DialogResult.OK)
            {
                //若使用者在Form2按下了OK,則進入這個判斷式
                textBox1.Text = "按下了" + f.DialogResult.ToString();
            }
            else if (f.DialogResult == System.Windows.Forms.DialogResult.Cancel)
            {
                //若使用者在Form2按下了Cancel或者直接點選X關閉視窗,都會進入這個判斷式
                textBox1.Text = "按下了" + f.DialogResult.ToString();
            }
            else
            {
                textBox1.Text = "按下了" + f.DialogResult.ToString();
            }
        }
    }
}


 

再來就是在Form2內編寫程式碼


using System.Windows.Forms;

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

            button1.DialogResult = System.Windows.Forms.DialogResult.OK;//設定button1為OK
            button2.DialogResult = System.Windows.Forms.DialogResult.Cancel;//設定button為Cancel
        }
    }
}


執行後就會發現,當按下Form1的按鈕後會出現Form2,但是此時不管怎麼點Form1都不會去觸碰到Form1的元件

且在Form2按下button1、button2、直接選擇X關閉視窗,都會在Form1的textbox1顯示出對應的回應

arrow
arrow
    全站熱搜

    Yang 發表在 痞客邦 留言(3) 人氣()