2014年11月13日 星期四

[C#] Form 呼叫 Form - 一個驗證登入程式的雛型

引入階段
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_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();
                }            }        }    }}


此外拜讀了土司貓部落格的文章“C# - Form呼叫Form物件導向的範例程式
”之後發現了一些道理:

每當按了呼叫另一個表單後,程式碼其實又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都是最原始的,當然也才能呼叫同一個表單。

沒有留言:

張貼留言