0

0

0

修罗

站点介绍

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

winform窗口数据传递

修罗 2023-01-13 622 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)


最新评论

  • https://www.studyglobus.com/author/carroll34a5552/

    Ценники на вывоз мусора сейчас космос, любые лайфхаки по экономии в тему.

  • Richardgrold

    1xbet onlayn kazino platforması ilə vaxtınızı daha səmərəli və maraqlı keçirin. Saytın canlı kazino bölməsi istifadəçilərə fərqli bir dünya təklif edir. Burada canlı dilerli kazino oyunlarının hər bir növünü sınaqdan keçirə bilərsiniz. Krupyelərin peşəkarlığı oyunun dinamikasını və marağını artırır. Müntəzəm olaraq yenilənən oyun siyahısı cansıxıcılığa yol vermir. Hesabınızı artırmaq üçün onlarla fərqli və etibarlı üsul mövcuddur. Qazanılan pullar cəmi bir neçə dəqiqə ərzində şəxsi hesabınıza köçürülür. Aktiv fəaliyyətinizə görə fərdi bonuslar və hədiyyələr qazana bilərsiniz. Dəstək xidməti həm çat, həm də e-poçt vasitəsilə kömək göstərir. 1xbet ailəsinə qoşulun və böyük uduşlar üçün ilk addımı atın. onlayn kazino

  • 砂岩白丘

    我一直梦想, 看到你们相册那样的地方。真棒。

  • 城市地標

    我喜欢, 这里分享真实经验。你的项目 就是 属于这里的。请继续。

  • 宗教地標

    我热爱这样的想法, 去那么多国家。真的很鼓舞。

  • 觀景高地

    能感受到热爱。继续保持 感受。

  • 最佳季節

    我关注这样的资源, 写得很实在。你的网站 就是 属于这里的。加油。

  • 1

    1

  • 1

    1

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

    1

日历

2026年07月

   1234
567891011
12131415161718
19202122232425
262728293031 

文章目录

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