Winform窗体传值

本文介绍了一个使用C#实现的简单示例,通过两个窗体类演示了委托和事件的基本用法。父窗体注册子窗体的方法作为委托,并触发事件通知另一个窗体更新消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

委托实现和事件实现

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

            ChildForm childForm = new ChildForm();
            //注册方法
            SetTextDel += childForm.SetText;

            EventChildForm eventChildForm = new EventChildForm();
            //注册事件
            TxtMsgChangeHandler += eventChildForm.ParentTxtMsgChangeHandler;

            eventChildForm.Show();
            childForm.Show();           
        }
        //定义一个委托属性
        private Action<string> SetTextDel { get; set; }
        //定义一个textbox的text改变的事件
        private event EventHandler TxtMsgChangeHandler;

        private void btnSendMsg_Click(object sender, EventArgs e)
        {
            if(SetTextDel==null)
            {
                return;
            }
            //执行委托
            SetTextDel(txtMsg.Text);
            //触发事件
            TxtMsgChangeHandler(this, new EventArgTxtChange() { Text = this.txtMsg.Text });
        }
    }
 public partial class ChildForm : Form
    {
        public ChildForm()
        {
            InitializeComponent();
        }

        public void SetText(string text)
        {
            txtMsg.Text = text;
        }
    }
public partial class EventChildForm : Form
    {
        public EventChildForm()
        {
            InitializeComponent();
        }

        public void ParentTxtMsgChangeHandler(object sender, EventArgs e)
        {
            EventArgTxtChange eTxtChange = e as EventArgTxtChange;
            txtMsg.Text = eTxtChange.Text;
        }
    }
public class EventArgTxtChange:EventArgs
    {
        public string Text { get; set; }
    }


内容概要:本文详细介绍了900W或1Kw,20V-90V 10A双管正激可调电源充电机的研发过程和技术细节。首先阐述了项目背景,强调了充电机在电动汽车和可再生能源领域的重要地位。接着深入探讨了硬件设计方面,包括PCB设计、磁性器件的选择及其对高功率因数的影响。随后介绍了软件实现,特别是程序代码中关键的保护功能如过流保护的具体实现方法。此外,文中还提到了充电机所具备的各种保护机制,如短路保护、欠压保护、电池反接保护、过流保护和过温度保护,确保设备的安全性和可靠性。通讯功能方面,支持RS232隔离通讯,采用自定义协议实现远程监控和控制。最后讨论了散热设计的重要性,以及为满足量产需求所做的准备工作,包括提供详细的PCB图、程序代码、BOM清单、磁性器件和散热片规格书等源文件。 适合人群:从事电力电子产品研发的技术人员,尤其是关注电动汽车充电解决方案的专业人士。 使用场景及目标:适用于需要高效、可靠充电解决方案的企业和个人开发者,旨在帮助他们快速理解和应用双管正激充电机的设计理念和技术要点,从而加速产品开发进程。 其他说明:本文不仅涵盖了理论知识,还包括具体的工程实践案例,对于想要深入了解充电机内部构造和工作原理的人来说是非常有价的参考资料。
在 C# 的 WinForms 开发中,窗体之间的数据递可以通过多种方式进行实现。以下是基于提供的引用内容以及专业知识总结的常见方法及其具体示例。 --- ### 方法一:通过保存对象的引用调用其方法 此方法的核心在于父窗体保留子窗体的对象实例,并通过该实例访问子窗体中的属性或方法来完成数据递[^1]。 #### 示例代码 ```csharp // 主窗体 (Form1.cs) public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.ShowDialog(); // 调用子窗体的方法获取返回 label1.Text = form2.GetResultValue(); } } // 子窗体 (Form2.cs) public partial class Form2 : Form { private string result; public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { result = textBox1.Text; this.Close(); } public string GetResultValue() { return result; } } ``` 这种方法适用于简单的场景,但在多窗体交互时可能显得不够灵活。 --- ### 方法二:通过委托实现窗体间的通信 利用委托可以实现在子窗体关闭后通知主窗体更新数据的功能。这种方式更加解耦合,适合复杂的业务逻辑[^2]。 #### 示例代码 ```csharp // 定义一个委托类型 public delegate void DataChangedHandler(string data); // 子窗体 (Form2.cs) public partial class Form2 : Form { public event DataChangedHandler OnDataChanged; public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { if (OnDataChanged != null) { OnDataChanged(textBox1.Text); } this.Close(); } } // 主窗体 (Form1.cs) public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.OnDataChanged += new DataChangedHandler(UpdateLabel); form2.Show(); } private void UpdateLabel(string data) { label1.Text = data; } } ``` 这种设计遵循了观察者模式的思想,使得多个窗体能够监听同一个事件并作出响应。 --- ### 方法三:通过构造函数参数递数据 可以在创建新窗体时,通过构造函数向目标窗体递必要的初始化数据[^4]。 #### 示例代码 ```csharp // 主窗体 (Form1.cs) private void button1_Click(object sender, EventArgs e) { Form2 form2 = new Form2(this.textBox1.Text); // 将文本框的内容作为参数递 form2.Show(); } // 子窗体 (Form2.cs) public partial class Form2 : Form { public Form2() { InitializeComponent(); } public Form2(string message) { InitializeComponent(); this.label1.Text = message; // 接收来自主窗体的数据 } } ``` 这种方法简单直观,特别适合于仅需一次性输少量数据的情况。 --- ### 方法四:通过公共变量共享数据 如果两个窗体属于同一应用程序上下文,则可以直接定义全局静态变量或者类级别的成员变量来进行跨窗体的数据交换[^3]。 #### 示例代码 ```csharp // 公共类用于存储共享数据 public static class SharedData { public static string TerminalID { get; set; } } // 主窗体 (Form1.cs) private void button1_Click(object sender, EventArgs e) { SharedData.TerminalID = "q13bh01-bh12"; Form2 form2 = new Form2(); form2.Show(); } // 子窗体 (Form2.cs) private void Form2_Load(object sender, EventArgs e) { label1.Text = SharedData.TerminalID; // 获取主窗体设置的终端ID } ``` 尽管方便快捷,但过度依赖此类方式可能导致程序结构混乱,因此应谨慎使用。 --- ### 总结 以上四种方法各有优劣: - **方法一** 和 **方法四** 更加直接易懂,但对于大型项目来说维护成本较高; - **方法二** 借助委托机制增强了灵活性和可扩展性; - **方法三** 则非常适合处理初始状态下的固定数据流动问题。 实际开发过程中可以根据具体情况选择最合适的方案。 --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值