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日

相关文章

  • C#代码设置开机启动示例

    下面我将详细讲解一下如何用C#代码设置开机启动,并提供两个示例。 1. 创建注册表键值 我们可以通过创建注册表键值来实现开机启动。具体步骤如下: 引入Microsoft.Win32命名空间 using Microsoft.Win32; 创建一个RegistryKey对象,指定键值的位置。键值的位置在HKEY_CURRENT_USER\Software\Mic…

    C# 2023年5月31日
    00
  • ASP.NET页面进行GZIP压缩优化的几款压缩模块的使用简介及应用测试!(附源码)第1/2页

    ASP.NET页面进行GZIP压缩优化的几款压缩模块的使用简介及应用测试 简介 GZIP压缩是一种常用的网页页面优化技术。传输时,服务端对浏览器请求的数据进行压缩,减少传输数据量,提高页面的加载速度。本文将介绍ASP.NET页面进行GZIP压缩优化的几款压缩模块的使用方法,并进行应用测试。 使用方法 在ASP.NET网站中实现GZIP压缩,需要使用第三方的压…

    C# 2023年5月31日
    00
  • C#中结构体定义并转换字节数组详解

    关于“C#中结构体定义并转换字节数组详解”,这是一篇关于C#中结构体的定义及转化字节数组的攻略,主要涉及以下几个方面: 结构体定义 结构体转换为字节数组的方法 字节数组转换为结构体的方法 示例说明 结构体定义 在C#中,结构体与类非常类似,也是一种自定义的数据类型,可以包含多个不同的数据类型(包括值类型和引用类型),但与类不同的是,结构体是一种值类型,它们在…

    C# 2023年6月7日
    00
  • 提示出现unresolved external symbol _main的解决方法

    针对提示出现unresolved externalsymbol _main的解决方法,我们可以按照以下步骤进行操作: 1. 首先确定你的程序是C++程序还是C程序 在Visual Studio中,C++程序的入口点是main函数,而C程序的入口点是wmain函数。因此,如果你的程序是C++程序,那么你的main函数需要包含正确的参数列表,如下所示: int …

    C# 2023年5月15日
    00
  • Visual Studio Connected Services 生成http api 调用代码

    生成的代码将和接口对应的参数、返回值一一对应,本文底层使用的工具为NSwag.exe,其他可替代的方案还有AutoSet.exe。本文中生成的代码将在编译过程中自动编译,类似grpc生成代码的模式,如果使用AutoSet则需要手动引入代码。另外也可以使用NSwag对应的vs插件(https://marketplace.visualstudio.com/ite…

    C# 2023年5月11日
    00
  • 详解如何使用Net将HTML简历导出为PDF格式

    如何使用.NET将HTML简历导出为PDF格式攻略 在本攻略中,我们将深入讲解如何使用.NET将HTML简历导出为PDF格式,并提供两个示例说明。 步骤一:安装NuGet包 在使用.NET将HTML简历导出为PDF格式之前,我们需要安装NuGet包。以下是安装NuGet包的步骤: 在Visual Studio中,打开NuGet包管理器控制台。 运行以下命令:…

    C# 2023年5月17日
    00
  • 详解C#中的Async和Await用法

    下面是《详解C#中的Async和Await用法》的完整攻略: 1. Async 和 Await 是什么 async 和 await 是 C# 语言中异步编程的关键词,使用这两个关键词可以让我们更方便地编写异步的代码。async 用于标记方法为异步方法,await 用于挂起异步方法并等待异步方法返回结果。 2. 异步方法的定义 异步方法的定义类似于普通方法,只…

    C# 2023年6月6日
    00
  • ASP.NET中下载文件的几种实例代码

    ASP.NET中下载文件的几种实例代码可以分为以下几种: 方法1:使用Response对象下载文件 使用Response对象下载文件是最简单和直接的方式,可以在服务器端使用C#代码将文件发送到客户端。 protected void btnDownload_Click(object sender, EventArgs e) { string filePath …

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