0

0

0

修罗

站点介绍

只有了解事实才能获得真正的自由

winform窗口数据传递

修罗 2023-01-13 409 0条评论 c#

首页 / 正文

winform窗口数据传递

有如下两个窗体,如何在两个窗体之间传值呢?

image-20230113182155155.png

父传子

方法一:通过构造函数

  • 父窗体点击跳转按钮
// 获取输入内容
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();
}

评论(0)


最新评论

  • 1

    1

  • 1

    1

  • -1' OR 2+158-158-1=0+0+0+1 or 'TKCTZnRa'='

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • @@5Qa2D

    1

  • 1

    1

  • 1

    1

日历

2025年09月

 123456
78910111213
14151617181920
21222324252627
282930    

文章目录

推荐关键字: Linux webpack js 算法 MongoDB laravel JAVA jquery javase redis