Method 1
sends messages through PostMessage in Form1, and interacts with messages intercepted through DefWndProc in Form2. For details, please refer to my previous article "C# Send, receive and process custom WINDOWS messages"
Method 2
is implemented through public static members of third-party public classes
class class1
{
public static string str;//公用字符串
}
The following content is from the Internet, I have corrected the errors and simplified them.
Method 3
The main form passes its own this reference to the child form's constructor. The code is as follows:
main form.cs
private void button1_Click(object sender, EventArgs e)
{
Form1 f1 = new Form1(this);
f1.Show();
}
subform.cs
public partial class Form1 :Form
{
private frmMain mForm;
public Form1(frmMain f)
{
this.mForm = f;
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
mForm.Text = "1 通过“指针”传递信息";
}
}
Method 4
To limit the functionality exposed by the main form to child forms, use an interface. code show as below:
define interface.cs
publicinterface IChangeTitle
{
void ChangeTitle(string title);
}
main form.cs
public void ChangeTitle(string title)
{
this.Text = title;
}
private void button2_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2(this);
f2.Show();
}
subform.cs
publicpartial class Form2 : Form
{
private IChangeTitle ichangeTitle;
public Form2(IChangeTitle ichangeTitle)
{
InitializeComponent();
this.ichangeTitle=ichangeTitle;
}
private void button1_Click(object sender,EventArgs e)
{
// 通过接口来调用方法
ichangeTitle.ChangeTitle("2 通过“接口”传递信息");
}
}
Method 5
To further reduce the coupling between forms, use delegates. code show as below:
main form.cs
protected void FormTitleChanged(string title)
{
this.Text = title;
}
private void button3_Click(object sender, EventArgs e)
{
Form3 f3 = new Form3();
f3.TitleChanged = newForm3.TitleChangedHandler(FormTitleChanged);
f3.Show();
}
subform.cs
publicpartial class Form3 : Form
{
// 声明和定义委托
public delegate void TitleChangedHandler(string title);
public TitleChangedHandler TitleChanged;
public Form3()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (TitleChanged != null)
TitleChanged("3 通过“委托代理”传递信息"); //委托调用
}
}
Method 6
Better yet, define a custom event and its event parameters in the subform. code show as below:
main form.cs
protected void FormTitleChanged(object sender,Form4.TitleChangedEventArgs e)
{
this.Text = e.Title;
}
private void button4_Click(object sender, EventArgs e)
{
Form4 f4 = new Form4();
f4.TitleChanged+= new Form4.TitleChangedEventHandler(FormTitleChanged);
f4.Show();
}
Subform.cs
publicpartial class Form4 : Form
{
public class TitleChangedEventArgs : EventArgs // 事件参数类
{
private string title = "";
public string Title
{
get { return title; }
set { title = value; }
}
}
// 声明委托
public delegate void TitleChangedEventHandler(object sender,TitleChangedEventArgs e);
// 定义事件
public event TitleChangedEventHandler TitleChanged;
public Form4()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
TitleChangedEventArgs e1 = new TitleChangedEventArgs();
e1.Title = "4 通过“触发事件”传递信息";
OnTitleChanged(e1);// 触发事件
}
// 触发事件的方法
protected virtual void OnTitleChanged(TitleChangedEventArgse)
{
if (TitleChanged != null)
TitleChanged(this, e);
}
}