C#窗体间常用的几种传值方式及委托与事件详解

C#窗体间常用的几种传值方式及委托与事件详解
本文将介绍C#窗体之间常用的几种传值方式,包括参数传递、全局变量、委托、事件等,并详解委托与事件的概念和使用方法。

参数传递
参数传递是最简单的窗体之间传值的方式,即在调用方法时将参数传递给被调用方法。

示例:

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
    Form2 f2 = new Form2();
    f2.Show();

    f2.SetTitle(textBox1.Text);
}

}

public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}

public void SetTitle(string title)
{
    this.Text = title;
}

}
在 Form1 中点击按钮后,创建并显示 Form2 并将 textBox1 的文本传递给 Form2 的 SetTitle 方法,在 SetTitle 方法中设置了 Form2 的标题。

全局变量
全局变量是指在一个应用程序中可以在所有窗体之间共享的变量,在一个窗体中声明后,其它窗体也可以访问和修改该变量的值。使用全局变量时,需要注意多线程访问和修改的同步问题。

示例:

public partial class Form1 : Form
{
public static string SharedString = “”;

public Form1()
{
    InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
    SharedString = textBox1.Text;

    Form2 f2 = new Form2();
    f2.Show();
}

}

public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();

    textBox1.Text = Form1.SharedString;
}

}
在 Form1 中点击按钮后,将 textBox1 的文本赋给全局变量 SharedString 并创建并显示 Form2,在 Form2 的构造函数中将 Form1 中的全局变量 SharedString 赋给 textBox1。

委托
委托是一种安全的、类型安全(type-safe)的函数指针,使用委托可以实现方法的回调和事件的处理。

示例:

public partial class Form1 : Form
{
public delegate void SetTitleDelegate(string title);
public SetTitleDelegate SetTitleHandler;

public Form1()
{
    InitializeComponent();

    // 将 SetTitle 方法绑定到 SetTitleHandler 委托上
    SetTitleHandler = SetTitle;
}

public void SetTitle(string title)
{
    this.Text = title;
}

private void button1_Click(object sender, EventArgs e)
{
    Form2 f2 = new Form2();
    f2.Show();

    // 通过调用委托实现传值
    SetTitleHandler(textBox1.Text);
}

}

public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
}
在 Form1 中定义了一个 SetTitleDelegate 委托,并将 SetTitle 方法绑定到 SetTitleHandler 委托上。在点击按钮后,创建并显示 Form2 并调用 SetTitleHandler 委托将 textBox1 的文本传递给 SetTitle 方法,实现了窗体之间的传值。

事件
事件是由特定条件触发的动作,使用事件可以实现多个窗体之间的通信和协调。在一个窗体中,定义事件和事件处理函数,在另一个窗体中通过订阅事件和事件处理函数实现事件的响应。事件的定义和使用需要考虑到多线程的同步问题。

示例:

public partial class Form1 : Form
{
public event EventHandler TitleChanged;

public Form1()
{
    InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
    Form2 f2 = new Form2();
    f2.Show();

    // 触发事件
    if (TitleChanged != null)
    {
        TitleChanged(this, EventArgs.Empty);
    }
}

}

public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();

    // 订阅事件
    ((Form1)Application.OpenForms[0]).TitleChanged += OnTitleChanged;
}

private void OnTitleChanged(object sender, EventArgs e)
{
    this.Text = ((Form1)sender).Text;
}

}
在 Form1 中定义了一个 TitleChanged 事件,并在点击按钮后触发该事件。在 Form2 的构造函数中订阅了 Form1 中的 TitleChanged 事件,并定义了对应的事件处理函数 OnTitleChanged,在事件触发后设置 Form2 的标题为 Form1 的标题。

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值