WinForm窗体之间操作

假设现在我有一个主窗体Form1,现想在另外两个窗体Form2,Form3中运用不同的方法来实现:修改Form2,Form3中的numericUpDown的值时Form1中textbox值随之改变。

先讲第一种方法,直接将整个窗体作为参数传给另一个窗体。

这是Form1中的代码:

  1. public partial class Form1 : Form  
  2.    {  
  3.   
  4.        public Form1()  
  5.        {  
  6.            InitializeComponent();  
  7.        }  
  8.   
  9.        //第一种方法示例事件   
  10.        public void changetext(string s)  
  11.        {  
  12.            this.textBox1.Text = s;  
  13.        }  
  14.   
  15.        //第一种方法   
  16.        private void button1_Click(object sender, EventArgs e)  
  17.        {  
  18.            //将整个窗体作为值传给Form2   
  19.            var frm2 = new Form2(this);  
  20.            frm2.ShowDialog();  
  21.        }  
  22.   
  23.        private void Form1_Load(object sender, EventArgs e)  
  24.        {  
  25.   
  26.        }  
  27.   
  28.   }  
 public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        //第一种方法示例事件
        public void changetext(string s)
        {
            this.textBox1.Text = s;
        }

        //第一种方法
        private void button1_Click(object sender, EventArgs e)
        {
            //将整个窗体作为值传给Form2
            var frm2 = new Form2(this);
            frm2.ShowDialog();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

   }

这是Form2中代码:

  1.   
[csharp] view plain copy print ?
  1. public partial class Form2 : Form  
  2.     {  
  3.         //这是第一种方法   
  4.         private Form1 f1;  
  5.         public Form2()  
  6.         {  
  7.             InitializeComponent();  
  8.         }  
  9.   
  10.         public Form2(Form1 frm1)  
  11.         {  
  12.             InitializeComponent();  
  13.             f1 = frm1;//将传过来的Form1全部赋值给f1,这样就可以在这边调用Form1了   
  14.         }  
  15.   
  16.         private void Form2_Load(object sender, EventArgs e)  
  17.         {  
  18.   
  19.         }  
  20.   
  21.         private void numericUpDown1_ValueChanged(object sender, EventArgs e)  
  22.         {  
  23.             //这是第一种方法   
  24.             //调用Form1中的changetext事件   
  25.             f1.changetext(numericUpDown1.Value.ToString());  
  26.         }  
  27.           
  28.     }  
第二种方法,使用委托与事件(推荐)

委托与事件的概念这里就不讲了,如果有兴趣,大家可以去看看张子阳的博客,博客地址

Form1中代码:

  1. public partial class Form1 : Form  
  2.     {  
  3.   
  4.         public Form1()  
  5.         {  
  6.             InitializeComponent();  
  7.         }  
  8.   
  9.         private void Form1_Load(object sender, EventArgs e)  
  10.         {  
  11.   
  12.         }  
  13.   
  14.         //改变值的事件   
  15.         private void frm2_changed(string s)  
  16.         {  
  17.             //此处是给原有窗体中控件赋值   
  18.             this.textBox1.Text = s + s;  
  19.         }  
  20.   
  21.         //清空值的事件   
  22.         private void frm3_empty(string s)  
  23.         {  
  24.             this.textBox1.Text = "";  
  25.         }  
  26.   
  27.         private void button2_Click(object sender, EventArgs e)  
  28.         {  
  29.             var frm3 = new Form3();  
  30.             //这是委托与事件的第二步,   
  31.             //写到+=时,按两次Tab键会自动生成frm2_changed,frm3_empty两个事件   
  32.             frm3.changed += new Form3.Form2Handle(frm2_changed);//改变值的事件   
  33.             frm3.empty += new Form3.Form2Handle(frm3_empty);//清空值的事件   
  34.             frm3.ShowDialog();  
  35.         }  
  36.     }  
public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        //改变值的事件
        private void frm2_changed(string s)
        {
            //此处是给原有窗体中控件赋值
            this.textBox1.Text = s + s;
        }

        //清空值的事件
        private void frm3_empty(string s)
        {
            this.textBox1.Text = "";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            var frm3 = new Form3();
            //这是委托与事件的第二步,
            //写到+=时,按两次Tab键会自动生成frm2_changed,frm3_empty两个事件
            frm3.changed += new Form3.Form2Handle(frm2_changed);//改变值的事件
            frm3.empty += new Form3.Form2Handle(frm3_empty);//清空值的事件
            frm3.ShowDialog();
        }
    }
Form3中代码:

  1. public partial class Form3 : Form  
  2.    {  
  3.        //定义带参数的委托与两个事件   
  4.        //这是委托与事件的第一步   
  5.        public delegate void Form2Handle(string s);  
  6.        public event Form2Handle changed;  
  7.        public event Form2Handle empty;  
  8.   
  9.        public Form3()  
  10.        {  
  11.            InitializeComponent();  
  12.        }  
  13.   
  14.        private void Form3_Load(object sender, EventArgs e)  
  15.        {  
  16.   
  17.        }  
  18.   
  19.        private void numericUpDown1_ValueChanged(object sender, EventArgs e)  
  20.        {  
  21.            //这是委托与事件的第三步   
  22.            //传值   
  23.            changed(numericUpDown1.Value.ToString());  
  24.        }  
  25.   
  26.        private void button1_Click(object sender, EventArgs e)  
  27.        {  
  28.            empty(numericUpDown1.Value.ToString());  
  29.        }  
  30.    }  
### C# WinForms 窗体间的数据传递方法 在C# WinForms应用程序中,窗体间的值传递可以通过多种方式实现。以下是几种常见的方法: #### 1. 构造函数传递参数 当创建新窗体实例时,可以利用构造函数来接受来自其他窗体的参数。 ```csharp // AForm.cs 中定义一个带参构造器用于接收数据 public partial class BForm : Form { public string PassedValue { get; set; } public BForm(string value) { InitializeComponent(); this.PassedValue = value; } } // 在AForm.cs中调用BForm并传入所需的信息 private void OpenAnotherForm_Click(object sender, EventArgs e){ var bform = new BForm("Hello from A form"); bform.ShowDialog(); // 或者 Show() 如果是非模态对话框 } ``` 这种方法简单明了,适合于只需要一次性的单向传输场景[^1]。 #### 2. 属性或公共字段访问 如果希望多个地方都能修改某个特定变量,则可以在目标窗体类内声明公开属性或字段,并直接对其进行设置。 ```csharp // 定义公有属性供外部访问 public partial class BForm : Form { public string SharedProperty {get;set;} ... } // 设置该属性的值 var bform = new BForm(); bform.SharedProperty = "Some Value"; ... ``` 这种方式允许更灵活的操作,但也可能带来潜在的安全隐患,因为任何代码都可以更改这些成员的状态[^5]。 #### 3. 使用事件机制 对于双向通信需求而言,采用自定义事件可能是更好的解决方案之一。源窗体会触发某些预设好的事件通知监听它的对象发生了变化;而后者则订阅前者发布的消息来进行响应处理。 ```csharp // 创建委托类型和对应的事件 public delegate void DataChangedEventHandler(object source, EventArgs args); public event DataChangedEventHandler OnDataChange; protected virtual void onDataChange(){ OnDataChange?.Invoke(this,new EventArgs()); } // 订阅此事件以获取更新后的信息 aForm.OnDataChange += (sender,args)=>{ Console.WriteLine(((Sender)sender).UpdatedInfo); }; ``` 这有助于保持各组件之间的松耦合关系,同时也便于维护大型项目中的复杂交互流程。 #### 4. 静态全局变量/静态类 虽然不推荐作为首选方案,但在小型应用里偶尔也会见到有人使用静态成员来做跨页面通讯的工作。只需在一个单独的位置保存好待交换的内容即可让所有参与方随时查阅最新状态。 ```csharp static class GlobalVariables{ static public string CommonVariable="Initial Value"; } // 修改共同拥有的资源 GlobalVariables.CommonVariable = newValue; Console.WriteLine(GlobalVariables.CommonVariable); ``` 不过要注意的是这种做法容易造成难以追踪的问题以及破坏模块独立性原则[^3]。 综上所述,在实际开发过程中应根据具体业务逻辑和个人偏好选择最合适的技术路线实施窗体间的数据流通工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值