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# 语言入门基础介绍 什么是 C# C# 是一种面向对象的编程语言,由 Microsoft 公司开发。它是 .NET 框架的一部分,可以用来开发各种类型的应用程序,例如桌面应用程序、Web 应用程序、移动应用程序等。 C# 语言和 Java 语言非常相似,都是基于面向对象的编程范式,具有相同的语法规则和编程思想。因此,如果您已经熟悉 Java 语言,那么学…

    C# 2023年5月15日
    00
  • ASP.NET Core应用错误处理之ExceptionHandlerMiddleware中间件呈现“定制化错误页面”

    ASP.NET Core应用错误处理之ExceptionHandlerMiddleware中间件呈现“定制化错误页面” 在ASP.NET Core应用程序中,错误处理是一个非常重要的方面。当应用程序出现错误时,我们需要能够捕获并处理这些错误,以便向用户提供有用的信息。在本攻略中,我们将深入讲解如何使用ExceptionHandlerMiddleware中间件…

    C# 2023年5月17日
    00
  • 利用C#实现合并Word文档功能

    实现合并Word文档功能主要涉及到以下几个步骤: 1. 安装OpenXML SDK OpenXML SDK是用于处理Office文件的开源API,我们可以使用它来处理Word文档。 安装方法: 在Visual Studio中打开NuGet包管理器(Tools -> NuGet Package Manager -> Manage NuGet Pac…

    C# 2023年6月1日
    00
  • c# 泛型类型参数与约束的深入分析

    C# 泛型类型参数与约束的深入分析 泛型类型参数 C# 泛型是指在编译时不确定数据类型,而在运行时再确定数据类型的一种机制。可以通过泛型类型参数来定义泛型类型。泛型类型参数在定义泛型类型时作为占位符使用。 具体来说,泛型类型参数的格式如下所示: class MyGenericClass<T> { } 在上述代码中,<T> 就是一个泛型…

    C# 2023年6月7日
    00
  • C#快速实现IList非泛型类接口的自定义类作为数据源

    要快速实现IList非泛型类接口的自定义类作为数据源,可以按照以下步骤进行: 在自定义类中添加IList接口实现 public class MyList : IList { // 实现IList接口需要的属性和方法 // … } 实现IList接口需要的属性和方法 IList接口需要实现的属性和方法比较多,包括索引器、Add、Clear、Contains…

    C# 2023年5月15日
    00
  • C#中Trim()、TrimStart()、TrimEnd()的用法介绍

    当我们操作字符串时,通常需要删除一些空格或者其他不需要的字符。在C#中,可以使用Trim()、TrimStart()、TrimEnd()三个方法来实现对字符串的删除操作。下面就来详细讲解一下这三个方法的用法。 Trim()方法 Trim()方法可以删除字符串前后的空格或指定字符集,其语法如下: string Trim(); string Trim(param…

    C# 2023年6月7日
    00
  • C# Linq的Any()方法 – 确定序列中是否存在元素

    Any() 方法是 C# LINQ 中的一种用于判断集合中是否存在任何元素满足给定条件的方法。此方法的语法如下: bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate); 其中,source 是需要检查的集合,pr…

    C# 2023年4月19日
    00
  • C#四舍五入用法实例

    C#四舍五入用法实例攻略 本文将详细讲解C#中四舍五入的使用方法及应用场景。 四舍五入的用途 在实际开发中,我们需要处理浮点数,但是由于计算机的机器精度限制,运算中可能会产生精度误差。因此需要对浮点数进行四舍五入运算,以保证结果的精度。 Math.Round的用法 在C#中,我们可以使用Math.Round方法进行四舍五入运算。其语法如下: public s…

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