winform窗口数据传递
有如下两个窗体,如何在两个窗体之间传值呢?
父传子
方法一:通过构造函数
- 父窗体点击跳转按钮
// 获取输入内容
string username = textBox1.Text;
string password = textBox2.Text;
// 创建User对象,User对象有两个属性,UserName,PassWord
User user = new() {
UserName = username,
Password = password
};
// 通过构造函数将user对象传递给子窗体
Form2 form2 = new Form2(user);
// 显示子窗体
form2.Show();
- 子窗体使用构造函数接收数据。
// 成员属性
User user;
// 构造函数
public Form2(User user)
InitializeComponent();
this.user = user;
}
// 并在Load事件中赋值给输入框
textBox1.Text = user.UserName;
textBox2.Text = user.Password;
方法二:静态变量传值
- 父窗体点击,将user放在一个公共类的静态属性中;
FCommon.user = new() {
UserName = username,
Password = password
};
- 子窗体从静态属性中获取
textBox1.Text = FCommon.user.UserName;
textBox2.Text = FCommon.user.Password;
方法三:通过窗体的Tag属性传值
// 父窗口给子窗口的tag属性挂载数据,子窗口能通过this.Tag直接获取
Form2.Tag = new() {
UserName = username,
Password = password
};;
方法四:公开的变量或属性
- 假设子窗口有一个pubic属性和需要传递的数据类型一样,直接挂到此属性上
Form2.user = new() {
UserName = username,
Password = password
};
方法五:事件参数
- 父窗体定义事件
public event Action<UserArgs> OnUserArgs;
- 定义UserArgs作为参数传递
public class UserArgs:EventArgs
{
public string UserName { get; set; }
public string Password { get; set; }
public UserArgs(string username, string password) {
this.UserName = username;
this.Password = password;
}
}
- 父窗体定义事件触发方法
public void InvokeEvent(UserArgs userArgs)
{
OnUserArgs?.Invoke(userArgs);
}
- 父窗口点击跳转
// 获取输入内容
string username = textBox1.Text;
string password = textBox2.Text;
Form2 form2 = new Form2();
// 将父窗体通过Tag传递到子窗体
form2.Tag = this;
form2.Show();
// 将参数传递给子窗体订阅的事件
InvokeEvent(new UserArgs(username, password));
- 子窗口Load事件中订阅事件
private void loadData() {
if(this.Tag!=null)
{
Form1 form1 = this.Tag as Form1;
form1.OnUserArgs += listenEvent;
}
}
// 订阅的事件,父窗体的InvokeEvent(new UserArgs(username, password));执行就会调用这里的方法
private void listenEvent(UserArgs userArgs)
{
textBox1.Text = userArgs.UserName;
textBox2.Text = userArgs.Password;
}
子传父
方法一:把父窗体实例传递到子窗体
- 父窗体定义方法,子窗体调用把数据传递过去
// 父窗体点击 。。。省略部分代码
form1.Tag = this;
// 父窗体定义方法接受数据
public void listenEvent(UserArgs userArgs)
{
textBox1.Text = userArgs.UserName;
textBox2.Text = userArgs.Password;
}
// 子窗体点击调用方法
private void jump_Click(object sender, EventArgs e) {
string UserName = textBox1.Text;
string Password = textBox2.Text;
Form1 form1 = this.Tag as Form1;
form1.listenEvent(new UserArgs(UserName, Password));
this.Close();
}
方法二:父窗体订阅事件
- 父窗体
public event Action<UserArgs> OnUserArgs;
public void InvokeEvent(UserArgs userArgs)
{
OnUserArgs?.Invoke(userArgs);
}
public void listenEvent(UserArgs userArgs)
{
textBox1.Text = userArgs.UserName;
textBox2.Text = userArgs.Password;
}
// 跳转
private void jump_Click(object sender, EventArgs e)
{
form2.Tag = this;
form2.Show();
}
- 子窗体
private void jump_Click(object sender, EventArgs e)
{
string UserName = textBox1.Text;
string Password = textBox2.Text;
Form1 form1 = this.Tag as Form1;
// 父窗体事件订阅父窗体的方法
form1.OnUserArgs += form1.listenEvent;
// 调用父窗体事件发送,父窗体的订阅方法会收到数据
form1.InvokeEvent(new UserArgs(UserName, Password));
this.Close();
}
1
1
1
1
1
1
1
1
1
1