我有一个Windows应用程序有三种形式:Form1,2,3。
- 表单1,有两个按钮,openform2,openform3。 --Form2有一个textbox form2_textbox和一个按钮form2_button --Form3有一个textbox form3_textbox
现在,在form1上单击按钮openform2,Form2打开,在Form2的textbox form2_textbox中输入一个字符串,现在当点击此表单的bu tton form2_button时,我希望Form1收到此字符串值&将它存储在字符串receivefromform2中, 然后将此字符串值显示在Form3的form3_textbox上。
请指导我如何完成这项任务?
答案 0 :(得分:4)
忽略他们是形式的事实。将它们视为任何其他对象 - 您将使用属性,方法,事件和构造函数。 GUI控件有一些奇怪的地方,主要是在线程亲和性方面,但通常你应该像对待其他任何东西一样对它们应用相同的面向对象的方法。
例如,在Form1中构造Form2时,将事件处理程序添加到Form2中的按钮(通过在Form2中创建一个新事件或通过属性公开按钮并直接附加它)。事件处理程序会向Form2询问文本框中的文本,并在创建Form3时使用它。
答案 1 :(得分:1)
有几种方法可以做到这一点。使用.NET事件是一个但需要相当耦合的布线。
我建议(这就是我这样做)是使用你自己的总线(观察者模式)。我们称之为MessageBus。您的所有表单都可以使用此总线的相同实例,当有趣的事情发生时,您可以发布一些消息。我会保持强烈打字,但为了简单起见,我们这样说:
public class Message<T>
{
public string Name { get; set; }
public T Data { get; set; }
}
然后,您的总线上会有订阅者回复他们感兴趣的消息。
public class MessageBus
{
public void Subscriber(ISubscriber subsriber)
{
// register your subscriber in some list
}
public void Publish(Message message)
{
// loop through subscribers and let them know
// e.g. subscriber.Handle(message);
}
}
因此,为了将所有这些内容连接起来,每个希望发布事件的表单(例如你的form2)都需要对消息总线的引用,并且每个对接收事件感兴趣的对象(例如form3)都会注册为订户。
使用.NET事件的唯一区别是各个发布者和订阅者不需要彼此了解,因此它们松散耦合 - 他们只需要了解总线。使用.NET事件可以获得相同的松散耦合,但这需要很多花哨的步法。
我认为不止一种方法可以给猫皮肤。
我在我的复合ui框架中有一个更成熟的实现,我用于FOSS服务总线上的工具。如果您有兴趣,可以看看:
Shuttle Service Bus on CodePlex
如果您下载源代码,您将在Shuttle.Core.UI项目中找到它。
希望它有意义。