引入階段
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 pilot_line_test
{
public partial class Login_Form : Form
{
public Login_Form()
{
建立選項選單
建立選項選單
InitializeComponent();
comboBox1.Items.Add("DL1");
comboBox1.Items.Add("DL2");
comboBox1.Items.Add("BB");
comboBox1.Items.Add("CAPT");
comboBox1.Items.Add("BB1");
comboBox1.Items.Add("CAPT1");
}
密碼驗證函式
密碼驗證函式
public int check_password(String password)
{
String pwd_text = "1234";
if (password.Equals(pwd_text))
{
return 0;
}
else
return 1;
}
private void button1_Click(object sender, EventArgs e)
{
int check_result;
String select_station;
String password = pwd.Text;
check_result = check_password(password);
if (check_result == 1)
{
MessageBox.Show("密碼錯誤");
}else
{
select_station = comboBox1.Text;
if (select_station.Equals("DL1")){
如果等於dl1跳入dl1視窗 並將當前視窗隱藏 以此類推...
如果等於dl1跳入dl1視窗 並將當前視窗隱藏 以此類推...
DL1_Form f1 = new DL1_Form();
f1.Show();
this.Hide();
}else if(select_station.Equals("DL2")){
DL2_Form f2 = new DL2_Form();
f2.Show();
this.Hide();
}else if (select_station.Equals("BB")){
BB_Form f3 = new BB_Form();
f3.Show();
this.Hide();
}else if (select_station.Equals("CAPT")){
CAPT_Form f4 = new CAPT_Form();
f4.Show();
this.Hide();
} } } }}
”之後發現了一些道理:
每當按了呼叫另一個表單後,程式碼其實又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都是最原始的,當然也才能呼叫同一個表單。
沒有留言:
張貼留言