幾種WinForm的Form與Form之間的傳值方法

寫WinForm的程式,使用Form與Form之間的傳值方式並不少見,但從WebForm跳來寫WinForm的,可能就會搞不清楚WinForm的做法,所以這個問題也被常常拿出來,所以這邊大概列了幾種做法供參考.

寫WinForm的程式,使用Form與Form之間的傳值方式並不少見,但從WebForm跳來寫WinForm的,可能就會搞不清楚WinForm的做法,所以這個問題也被常常拿出來,所以這邊大概列了幾種做法供參考.

 

1. 在Form1輸入值,在開啟Form2時,顯示Form2的值,而Form2關閉後,將Form2的值帶回Form1.

Form2

public Form2()
{
	InitializeComponent();
}

public Form2(string strTextMsg)
{
	InitializeComponent();
	textBox1.Text = strTextMsg;
}

public string TextBoxMsg
{
	set
	{
		textBox1.Text = value;
	}
	get
	{
		return textBox1.Text;
	}
}

Form1

方式1

Form2 obj = new Form2();
obj.TextBoxMsg = textBox1.Text;//把form1的值設定到form2
if (obj.ShowDialog() == DialogResult.OK)
{
	this.textBox1.Text = obj.TextBoxMsg;//從form2取值設定到form1
}

方式2

Form2 obj = new Form2(textBox1.Text);//把Form1的值給到Form2
if (obj.ShowDialog() == DialogResult.OK)
{
	this.textBox1.Text = obj.TextBoxMsg;從Form2取值並顯示到Form1
}

2. 在Form2沒有關閉的情況下,Form2對Form1傳值與執行Form1的Function

Form2

public Form2(Form1 Parentform)//Parent Form
{
	InitializeComponent();
	this.Tag = Parentform;
}

private void button1_Click(object sender, EventArgs e)
{
	((Form1)this.Tag).setTextBoxMsg = textBox1.Text;//傳值設定Form1的TextBox
	((Form1)this.Tag).DoSomething("From Child");//執行Form1的Function
}

Form1

private void button4_Click(object sender, EventArgs e)
{
	Form2 obj = new Form2(this);
	obj.ShowDialog();
}

public string setTextBoxMsg
{
	set
	{
		textBox1.Text = value;
	}
}

public void DoSomething(string Msg)
{
	MessageBox.Show(Msg);
}

 

3. 同樣是Form1取Form2的值,不過做法是直接將Control的Modifiers可見層級提升.

Form2

以這個例子來說,Modifiers設為Internal.

internal System.Windows.Forms.TextBox textBox1;

Form1

Form2 obj = new Form2();
obj.ShowDialog();
textBox1.Text = obj.textBox1.Text;//這裡就可以直接拿Form2來用,所以Text屬性當然也能取得.

4. MDI的各Form互相傳值.

 

 

MDI Form Container

Form2 f2 = new Form2();
f2.MdiParent = this;
f2.Show();
Form3 f3 = new Form3();
f3.MdiParent = this;
f3.Show();

MDI Clild Form Form2 傳值給同樣是MDI Child Form的Form3

Form2

Form[] aryf = this.Parent.FindForm().MdiChildren;
foreach (Form f in aryf)
{
	if (f.Name == "Form3")
	{
		((Form3)f).TextBoxMsg = textBox1.Text; ;
		break;
	}
}

Form3

 

public string TextBoxMsg
{
	set
	{
		textBox1.Text = value;
	}
	get
	{
		return textBox1.Text;
	}
}

MDI Form2設定Parent Container的Text

this.Parent.FindForm().Text = textBox1.Text;

範例程式碼 : TwoForms.zip