首頁 > 軟體

C#實現不同表單之間傳遞引數

2023-02-27 06:00:41

C#不同表單之間傳遞引數

最近導師安排C#寫桌面GIS開發。碰到諸多問題。無奈不是計算機出身的我早就把程式設計基礎還給老師了。

開發過程屬於敲程式碼兩分鐘翻部落格兩小時的狀態,這邊將自己的問題及解決方案總結。

主要兩個內容:

①父視窗給子視窗傳遞引數,

②子視窗給父視窗傳遞引數。

1.父視窗向子視窗傳遞引數

這個就比較簡單了,級別高一點存取也輕鬆一點。具體的原理我就不講了(感覺說不清楚OJ2…),總之使用類的私有變數然後父視窗賦值就可以了。

父視窗(mainForm)程式碼:

namespace demo_Params
{
    public partial class mainForm : Form
    {
        public mainForm()
        {
            InitializeComponent();
        }
        
        //傳遞變數到子視窗
        private void btn_Input_BtnClick(object sender, EventArgs e)
        {
            childForm childForm = new childForm();//childForm為新建視窗類
            childForm.str = this.tb_MainFormIn.InputText ;//str為子類的公有變數
            if (childForm.ShowDialog() == DialogResult.OK) return;
        }

        
    }
}

子視窗(childForm)程式碼:

namespace demo_Params
{
    public partial class childForm : Form
    {
        public childForm()
        {
            InitializeComponent();
        }

        //私有變數和賦值,value值在父視窗傳遞
        private string w_str;
        public string str
        {
            set
            {
                w_str = value;
            }
        }
        //顯示父視窗的變數到文字方塊
        private void btn_getPara_BtnClick(object sender, EventArgs e)
        {
            this.tb_childFormIn.Text = w_str;
        }
    }
}

2.子視窗向父視窗傳遞引數

這個就比較麻煩了,看了很多,自己用起來感覺不錯的是通過委託事件和事件觸發執行函數來解決引數的傳遞和接受。道理就不說了,直接COPY用起來。

父視窗(mainForm)程式碼:

namespace demo_Params
{
    public partial class mainForm : Form
    {
        public mainForm()
        {
            InitializeComponent();
        }
        //接受引數初始化
        string str = "";      
        //開啟子視窗childForm
        private void btn_openWin_BtnClick(object sender, EventArgs e)
        {

            childForm childForm = new childForm();
            childForm.getParam += new backParam(fun_GetChildParam);//繫結事件
            if (childForm.ShowDialog() == DialogResult.OK) return;
        }
        //委託事件執行方法
        void fun_GetChildParam(string w_childpara) 
        {
            str = w_childpara;
        }
        //顯示引數到文字方塊,看看引數能不能呼叫
        private void btn_Output_BtnClick(object sender, EventArgs e)
        {
            tb_MainFormOut.InputText = str;
        }
    }
}

子視窗(childForm)程式碼:

namespace demo_Params
{

    public delegate void backParam(string str);//宣告委託
    public partial class childForm : Form
    {
        public childForm()
        {
            InitializeComponent();
        }
        public event backParam getParam;//委託事件,接受一個string變數
        
        //傳回變數 關閉視窗
        private void btn_childFormBack_BtnClick(object sender, EventArgs e)
        {
            getParam(this.tb_childFormIn.Text);//將變數委託
            this.DialogResult = DialogResult.OK;
        }
    }
}


3.程式碼說明

兩種傳遞引數的情況,我寫在了一個程式裡面。整理時為了區分,有所刪改。(子傳父程式碼塊內不含父傳子內容)

直接複製程式碼至WPF專案中,應該不能執行。 使用了第三方控制元件,部分控制元件屬性、事件命名不同。大家如要復現使用TextBox和Button即可。

C#子表單與父表單之間的引數傳輸

最近在做專案時涉及到了子表單與父表單之間的引數傳輸問題,通過查閱與學習總結了一種方法。

1.子表單傳父表單

Form1為主表單,Form2為子表單。

實現:在Form1上新增一個button1,點選button1後顯示Form2,再點選Form2的button1 在button1_Click事件中通過this.Owner將Form2的textBox2的值設定給Form1的textBox1(也可以將Form2中的某個值傳給Form1,然後在Form1進行後續的處理,將範例程式碼修改一下即可)

範例程式碼:

    //Form1上的程式碼(主表單)
    public partial class Form1 : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            //顯示Form2
            Form2 childForm = new Form2();
            childForm.Show();
            //定義Form2的「爸爸」為Form1 
            calForm.Owner = this;
            
 
            或者
            //Form2 childForm = new Form2();
            //childForm.Show(this);
        }
    }
 
 
    //Form2上的程式碼(子表單)
    public partial class Form2 : Form
    {
        public CalibrationForm()
        {
            InitializeComponent();
        }
        private void button_Click(object sender, EventArgs e)
        {
            MainForm mForm = (MainForm)this.Owner;
            //注意 如果textBox1是放在panel1中的 則先找panel1 再找textBox1
            ((TextBox)mForm.Controls["textBox1"]).Text = this.textBox2.Text;
 
            //也可直接將控制元件的屬性Modifiers修改為public 然後直接呼叫
            mForm.textBox1.Text = this.textBox2.Text;
        }
     }

2.父表單傳子表單

Form1為主表單,Form2為子表單。

實現:在Form1上新增一個button1,點選button1後顯示Form2,然後點選Form2的button1顯示Form1中的某個引數。(用建構函式來範例化Form2表單,然後把Form1的this指標傳進去,這樣就可以在Form2中呼叫Form1的引數(此引數必須是public屬性的))

範例程式碼:

    //Form1上的程式碼(主表單)
    public partial class Form1 : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }
        
        public string str = "你好!";
        private void button1_Click(object sender, EventArgs e)
        {
            //範例化子表單,並將父表單的指標this傳入
            Form2 childForm = new Form2(this);
            childForm.Show();
        }
    }
 
 
    //Form2上的程式碼(子表單)
    public partial class Form2 : Form
    {
        public CalibrationForm()
        {
            InitializeComponent();
        }
 
        private Form1 frmMain;
        public Form2(Form1 mForm)
        {
            InitializeComponent();
            this.frmMain = mForm;
        }
 
        private void button1_Click(object sender,EventArgs e)
 
        {
 
             this.textBox1.Text = mForm.str;  
 
        }
     }

子表單與父表單之間的引數傳輸方法不止這一種,還可以用委託等,這裡只總結了個人認為較為簡單的一種方法,如果以後涉及委託會進行補充。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com