(Windows Form)两个打开的窗体之间相互调用。

看完之后你会发现很简单哦:

假设有两个窗体类 Form1(public) and Form2 

  • 在Form1中声明public 、static  、Form1类型的变量 pform1 ,代码:

public static  Form1 pform1 = null ;

  • 然后再在Form_Load事件里添加

pform1 = this;


这样你在两个窗体都打开时就可以在Form2的对象里调用了:

Form1.pform1.(Form1里的你想调用的公共控件)


同理,要想在Form1里调用Form2里的成员,只需要在Form2里面声明指向自己的公有、静态、Form1类型的变量 pform2就OK了。


*注意:标红的 static 是必须有的,需通过类型调用。


### 回答1: 假设我们需要在form2和form3之间传递一个字符串数据,可以使用消息机制来实现。 首先,在form2中定义一个消息ID: ``` public const int MyMessageID = 0x500; // 自定义消息ID ``` 然后在form3中定义一个消息处理函数: ``` protected override void WndProc(ref Message m) { if (m.Msg == MyMessageID) { string data = m.WParam.ToString(); // 获取消息传递的字符串数据 // 进行相应的处理 } base.WndProc(ref m); } ``` 接下来,在form1中,当需要传递数据时,可以通过以下方式发送消息给form3: ``` string data = "hello world"; SendMessage(form3.Handle, MyMessageID, IntPtr.Zero, data); ``` 在form3收到消息后,就可以获取到传递的字符串数据并进行相应的处理了。需要注意的是,form2和form3都需要重载WndProc方法来接收和处理消息。 ### 回答2: 通过消息机制实现数据在Form2和Form3之间的传递,可以使用C#中的事件和委托机制。 首先,在Form2中创建一个事件和对应的委托。 ```csharp public partial class Form2 : Form { public event EventHandler<DataEventArgs> DataTransfer; // 在合适的时机,触发数据传递事件 private void TransferData() { DataTransfer?.Invoke(this, new DataEventArgs("Hello from Form2")); } // 其他代码省略 } public class DataEventArgs : EventArgs { public string Data { get; } public DataEventArgs(string data) { Data = data; } } ``` 然后,Form3订阅Form2的数据传递事件,在事件处理方法中获取传递的数据。 ```csharp public partial class Form3 : Form { // Form3 中订阅Form2的数据传递事件 private void Form3_Load(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.DataTransfer += Form2_DataTransfer; form2.TransferData(); } private void Form2_DataTransfer(object sender, DataEventArgs e) { string data = e.Data; // 处理传递过来的数据 MessageBox.Show("Form3 received data: " + data); } // 其他代码省略 } ``` 最后,在Form1中打开Form2和Form3,使数据可以在两个窗体之间传递。 ```csharp public partial class Form1 : Form { private void buttonOpenForms_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); Form3 form3 = new Form3(); // 在Form1中打开Form2和Form3 form2.Show(); form3.Show(); } // 其他代码省略 } ``` 这样,通过消息机制,在Form2和Form3之间传递数据就实现了。当Form2调用`TransferData()`方法时,会触发DataTransfer事件,Form3订阅了这个事件,可以在事件处理方法中获取传递的数据并进行处理。 ### 回答3: 实现由form1打开两个窗体form2和form3之间的数据传递,可以使用消息机制来实现。具体的做法是,在form2和form3之间定义一个消息传递的中间件类,可以命名为MessageBroker。 首先,在MessageBroker类中定义一个公共的静态事件,用来传递数据。比如,可以定义一个名为DataChanged的事件,用来传递数据。 在form2中,当需要传递数据给form3时,调用MessageBroker类中的DataChanged事件,并传递需要传递的数据作为参数。例如,当form2中的按钮点击事件触发时,可以写下如下代码: ``` private void btnSendData_Click(object sender, EventArgs e) { string data = "Hello Form3!"; MessageBroker.DataChanged?.Invoke(this, new CustomEventArgs(data)); } ``` 在form3中,订阅MessageBroker类中的DataChanged事件,并在事件处理方法中获取传递的数据。例如,在form3的构造函数中,可以写下如下代码: ``` public Form3() { InitializeComponent(); MessageBroker.DataChanged += MessageBroker_DataChanged; } private void MessageBroker_DataChanged(object sender, CustomEventArgs e) { string data = e.Data; // 处理传递过来的数据 // ... } ``` 在以上代码中,CustomEventArgs是一个自定义的事件参数类,用于传递数据。例如: ``` public class CustomEventArgs : EventArgs { public CustomEventArgs(string data) { Data = data; } public string Data { get; } } ``` 通过以上的实现,当form2中的按钮点击事件被触发时,传递的数据会通过MessageBroker类的DataChanged事件被传递给form3,form3可以在事件处理方法中获取到这个数据并进行处理。 通过这种消息机制的实现,form2和form3之间的数据传递可以实现解耦,form1作为消息传递的中间人,不管是在form2还是form3中触发事件,都能够实现数据的传递。这样就可以在不需要直接引用对方窗体的情况下,轻松实现数据的传递和交互。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值