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 的文本传递给 Form2SetTitle 方法,在 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 的标题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#窗体间常用的几种传值方式及委托与事件详解 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • ListView异步加载图片实现思路(优化篇)

    ListView异步加载图片是常见的Android开发需求之一。在加载大量图片时,如果不使用异步加载,会严重影响应用性能和用户体验。本篇文章主要讲解如何使用ListView实现异步加载图片,并对其进行优化。 实现思路 创建一个ViewHolder类并在其中声明ImageView控件。 在ListView中加入标记每一个ImageView的Tag。 利用Lru…

    C# 2023年6月6日
    00
  • C#短时间内产生大量不重复的随机数

    产生大量不重复的随机数需要满足两个条件:随机性和不重复性,下面就使用C#语言,给出一种实现这个目标的攻略。 第一步:定义一个列表 在产生随机数时,需要先定义一个列表,用来存储已经产生过的随机数。因为需要保证随机数不重复,这个列表会存储已经被产生的随机数,每次产生一个新的随机数时,需要和这个列表中的所有元素进行比较,以确保不重复。具体实现代码如下: List&…

    C# 2023年6月1日
    00
  • C#常用目录文件操作类实例

    C#常用目录文件操作类实例 在C#的编程过程中,我们需要对文件和目录进行操作。为了方便开发,C#提供了一些常用的目录文件操作类。本文将详细介绍这些类的使用方法,并给出两个实例。 目录操作类 Directory类 Directory类提供了很多操作目录的方法,例如创建、删除、复制和移动目录等。 创建目录 创建目录的方法为: Directory.CreateDi…

    C# 2023年5月15日
    00
  • IIS7配置PHP图解(IIS7+PHP_5.2.17/PHP_5.3.5)

    IIS7配置PHP图解(IIS7+PHP_5.2.17/PHP_5.3.5) IIS7是一种Web服务器,可以用于托管ASP.NET和PHP应用程序。在IIS7中,可以使用PHP来开发Web应用程序。本文提供详细的“IIS7配置PHP图解(IIS7+PHP_5.2.17/PHP_5.3.5)”的完整攻略,包括如何安装PHP和IIS7,以及如何配置PHP和II…

    C# 2023年5月15日
    00
  • 深入了解c# 信号量和互斥体

    深入了解C# 信号量和互斥体 信号量(Semaphore) 信号量是一种线程同步工具,它可以在多个线程之间控制对资源的访问。Semaphore(信号量)在C#中,可以通过Semaphore类来实现。 基本概念 Semaphore可以理解为一个计数器,用于记录可同时访问某个资源的线程数量。假设信号量的值为n,那么前n个线程可以同时访问资源,第n+1个线程需要等…

    C# 2023年6月7日
    00
  • C#实现PDF签名时添加时间戳的2种方法(附VB.NET代码)

    让我来详细讲解一下“C#实现PDF签名时添加时间戳的2种方法(附VB.NET代码)”这篇文章的完整攻略。 一、背景 在使用C#代码实现PDF文件的数字签名时,如果需要添加时间戳的话,可以使用以下两种方法:基于PDF签名规范(PDF Signature Appearances)和基于PDF变量(PDF Variables)。两种方法均需使用第三方的时间戳服务器…

    C# 2023年6月1日
    00
  • ASP.NET加密口令的方法实例

    以下是关于”ASP.NET加密口令的方法实例”的完整攻略: 1. 什么是ASP.NET加密口令 ASP.NET加密口令是为了提高系统的安全性,在ASP.NET中使用的一种加密方法。通过这种方法,我们可以将用户的口令加密为一段不可逆的字符串,防止用户的口令被恶意获取和使用。 2. ASP.NET加密口令的方法实例 2.1 加密 使用ASP.NET加密口令的方法…

    C# 2023年6月3日
    00
  • C#中按字符串截取长字符串实例

    针对该话题,我为您提供以下完整攻略: 核心思路 在 C# 中按照某个字符串来截取另一个字符串,我们可以使用 Split() 方法,将原字符串按指定字符串进行切割,得到分割后的若干个子串,然后选择需要的子串即可。例如,如果我们要截取字符串 abcDefghijKlmnop 中间的 Defghij,即按照 D 来切割,我们可以得到 abc 和 efghijKlm…

    C# 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部