Google圖片廣告

平成21年12月10日木曜日

C# - Form呼叫Form物件導向的範例程式

在C#中物件導向上面要呼叫Form,相信大家不陌生吧!

最一般的寫法就是
// 呼叫Form2時先new一個Form2,在把Form2 Show出來
Form2 f2 = new Form2();
f2.Show();
this.Hide(); // this指Form1,Hide隱藏
看起來沒什麼問題。
另外一邊當然是
// 呼叫Form1,並把Form1 Show出來,再把Form2隱藏
Form1 f1 = new Form1();
f1.Show();

this.Hide();

看起來也沒問題,但是我寫了一個範例程式,Form1上有個TextBox1可以按旁邊的按鈕把數字1變成2,之後呼叫Form2後,再回來呼叫Form1,看看TextBox1是不是2。

範例程式1

結果當然不是,因為這些程式是每當按了呼叫另一個表單後,程式碼其實又new產生一個Form2,Form1,所以每次看到的表單都是new出來的,不是最早第一個new產生出來的視窗。

所以要改寫程式碼。

利用Form1自己多寫一個建構子,產生Form2並且把Form1自己傳到Form2,這樣Form2可以呼叫第一次進入程式產生的Form1。
private Form2 f2 = null;
public Form1()
{
InitializeComponent();

//在建構子new 一個Form2
f2 = new Form2(this); //產生一個Form2把Form1傳進去,要用this指Form1
}

而Form2要這樣寫
private Form1 f1 = null;
public Form2(Form1 f1) {
InitializeComponent();

this.f1 = f1; //this.f1是指FForm2內上面兩行寫的private Form1 f1 = null
// =號後面的f1是指(Form1 f1)建構子傳進來的的f1
}

而Form1要呼叫Form2的話,因為從Form2叫回原本的Form1,所以在叫一次Form2當然也是原本隱藏的Form2。

所以我在Form2放入一個空白的TextBox可以隨便填入值,來確定Form2是不是也呼叫到同一個。

值得注意的是Form1和Form2只new了一次,所以那些f1和f2都是最原始的,當然也才能呼叫同一個表單。
範例程式2

0 件のコメント: