Winform窗体之间传值
1.构造函数传值
创建窗体,默认都有一个无参构造方法,手动新增两个参数的构造方法
Form1
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2("Hpf","29");
form2.Show();
}
}
Form2
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public Form2(string name, string age)
{
InitializeComponent();
this.label1.Text = $"{name} - {age}";
}
}
2.Tag传值
比较灵活,根据需要,可以new不同的实体类;
将当前窗体一起传到子窗体中,实现子窗体调用父窗体的控件、方法、属性等
LoginModel 实体类
public class LoginModel
{
public string userName { get; set; }
public string passWord { get; set; }
public Form1 form1 { get; set; }
}
Form1
新增一个Buttom、一个Label 控件,将Label控件
Modifires
属性设置为public
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.label1.Text = "这是Form1";
}
private void button1_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.Tag = new LoginModel
{
userName = "Hpf",
passWord = "123",
form1 = this
};
form2.Show();
}
}
Form2
新增两个TextBox 控件、一个Label 控件
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
LoginModel loginModel = this.Tag as LoginModel;
this.txt_username.Text = loginModel.userName;
this.txt_pwd.Text = loginModel.passWord;
this.label1.Text = loginModel.form1.label1.Text;
}
}
3.事件传值
当前窗体产生一些重要数据,事件作为消息的通知者,将数据存储起来,发送给多个注册此事件的其他窗体
MyEventArg 类
/// <summary>
/// 从 EventArgs 派生的事件参数集
/// </summary>
public class MyEventArg : EventArgs
{
public string Text { get; set; }
}
Form1
新增一个Buttom、一个TextBox 控件
public partial class Form1 : Form
{
public event EventHandler SendMsgEvent; //使用默认的事件处理委托
public Form1()
{
InitializeComponent();
#region 方法3(推荐)--事件方式
//子窗体弹出来之前,注册事件,关注主窗体消息的变化,当有多个窗体需要接收信息,只需要在此修改即可
Form2 f2 = new Form2();
SendMsgEvent += f2.MainFormTxtChaned;//为子窗体注册事件,在子窗体中事件处理代码中设置文本
f2.Show();
#endregion
}
private void button1_Click(object sender, EventArgs e)
{
//触发事件
//EventArgs, 写一个子类继承该类,子类中添加需要封装的数据信息,此处只需要传递string信息,详见MyEventArgs
SendMsgEvent(this, new MyEventArg() { Text = this.textBox1.Text });
//模拟线程情况
//Task.Run(() =>
//{
// while (true)
// {
// SendMsgEvent(this, new MyEventArg() { Text = this.textBox1.Text });
// Thread.Sleep(500);
// }
//});
}
}
Form2
新增一个TextBox 控件
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public void MainFormTxtChaned(object sender, EventArgs e)
{
//取到主窗体的传来的数据
MyEventArg arg = e as MyEventArg;
this.textBox1.Text = arg.Text;
//若使用到线程,则使用此方法赋值
//this.Invoke(new EventHandler(delegate
//{
// this.textBox1.Text = arg.Text;
//}));
}
}