C# 窗体传值

本文介绍如何在Windows Forms应用程序中实现两个窗体之间的数据交互。具体地,通过使用模式对话框展示了一个实例,即如何从Form2将TextBox值返回到Form1的TextBox中。该过程涉及了构造函数参数传递及DialogResult的应用。

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

背景:窗体Form1和Form2 Form2由Form1打开(1、模式窗体 2、非模式)

要求:Form2的TextBox值传回Form1的TextBox中

Form1:      
 public partial class Form1 : Form      
   {      
       public Form1()      
       {      
           InitializeComponent();      
       }      
     
       private void button1_Click(object sender, EventArgs e)      
       {      
           Form2 frm = new Form2(this,textBox1.Text);//带参数构造Form2(此方法该处带俩参数构造多余)      
            
           if (frm.ShowDialog() == DialogResult.OK)      
           {      
               this.textBox1.Text += frm.ReturnText;//通过Form2的属性获得回传值      
           }      
           frm = null;      
                 
       }      
             
   Form2:      
    public partial class Form2 : Form      
   {      
       private Form1 pfrm;      
       private string frm1txt;      
       public Form2(Form1 parentfrm,string frm1text)      
       {      
           InitializeComponent();      
           pfrm = parentfrm;      
           frm1txt = frm1text;      
       }      
              public string ReturnText//回传值的属性      
       {      
           get { return this.frm1txt; }      
       }      
         private void button2_Click(object sender, EventArgs e)//给属性赋值并关闭模式窗体Form2      
       {      
           frm1txt = this.textBox2.Text;      
           this.DialogResult = DialogResult.OK;//*必加 模式窗体打开后 只有DialogResult初始化后才可继续操作 否则值无法传回      
           this.Close();//模式窗体关闭.close()相当于将窗体隐藏 彻底关闭需要用.Dispose()      
       }      
     
       private void button3_Click(object sender, EventArgs e)//关闭      
       {      
           this.DialogResult = DialogResult.Cancel;//同*      
           this.Close();      
       }    


### C# WinForms 窗体之间的方法与示例 在C# WinForms应用程序中,窗体之间的递是一项常见的需求。以下是几种常用的方式及其具体实现。 #### 方法一:通过公共静态变量 可以创建一个全局类来存储共享的数据,利用其静态属性完成窗体间的递。这种方式简单易懂,适合小型项目。 ```csharp // 定义一个用于保存共享数据的类 public static class SharedData { public static string Message { get; set; } } // 子窗体代码 (ChildForm.cs) private void button1_Click(object sender, EventArgs e) { SharedData.Message = textBox1.Text; this.Close(); // 关闭子窗体 } // 主窗体读取共享数据 (MainForm.cs) private void OpenChildFormButton_Click(object sender, EventArgs e) { ChildForm childForm = new ChildForm(); childForm.ShowDialog(); MessageBox.Show(SharedData.Message); // 显示从子窗体获取的消息 } ``` 此方法适用于简单的场景,但不推荐在复杂应用中广泛使用,因为它可能破坏封装性[^3]。 #### 方法二:通过构造函数参数 可以在打开新窗体时,通过构造函数将所需数据作为参数递给目标窗体。 ```csharp // 修改子窗体构造函数以接受参数 public partial class ChildForm : Form { public string PassedMessage { get; private set; } public ChildForm(string message) { InitializeComponent(); label1.Text = message; // 将接收到的信息显示到Label上 } private void button1_Click(object sender, EventArgs e) { PassedMessage = textBox1.Text; this.DialogResult = DialogResult.OK; Close(); } } // 调用并接收返回 private void OpenChildFormButton_Click(object sender, EventArgs e) { using (var form = new ChildForm("这是来自父窗体的消息")) { if (form.ShowDialog() == DialogResult.OK) { MessageBox.Show(form.PassedMessage); } } } ``` 这种方法更加面向对象化,能够有效减少对外部状态的依赖[^2]。 #### 方法三:事件驱动模式 定义自定义事件,在子窗体内触发该事件并将数据回至父窗体监听器处理。 ```csharp // 子窗体声明委托和事件 public delegate void DataPassEventHandler(object sender, DataEventArgs args); public event DataPassEventHandler OnDataPassed; protected virtual void RaiseOnDataPassed(DataEventArgs e){ OnDataPassed?.Invoke(this,e); } private void button1_Click(object sender, EventArgs e) { var dataArgs = new DataEventArgs{ TextValue = textBox1.Text }; RaiseOnDataPassed(dataArgs); this.Close(); } // 自定义事件参数类 public class DataEventArgs : EventArgs{ public string TextValue {get;set;} } // 在主窗体订阅事件 private void ShowChildForm(){ var childForm = new ChildForm(); childForm.OnDataPassed += HandleDataFromChild; childForm.ShowDialog(); } void HandleDataFromChild(object sender, DataEventArgs e){ MessageBox.Show(e.TextValue,"子窗体发送的数据"); } ``` 这种设计增强了组件间的解耦合度,特别适合于大型项目的模块划分[^4]。 --- ### 总结 上述三种方式各有优劣,开发者应根据实际应用场景选择最合适的方案。对于初学者而言,建议优先尝试前两种较为直观的技术路径;而对于追求高可维护性和扩展性的场合,则考虑采用基于事件的通知机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值