我有一个应用程序,在一个形式(Form1)我有很多checkBoxes和textBoxes,Form2我只有一个textBox ,但我想从Form1textBoxes中放入一些内容并放在textBox中Form2,像这样,但在表单之间:
textBox1.Text = "Test: " + textBox1 + "\n" + textBox3;
Run Code Online (Sandbox Code Playgroud)
由于textBox1在Form2与第二textBox1和textBox3的Form1,但我怎么能这样做呢?谢谢.
根据您启动第二个表单的方式,您可以在Form2中分配一个引用Form1的成员对象,或者如果您使用的是MDI接口,则可以从中检索Form1的引用.
例如,您可以在Form2类中使用以下代码:
public partial class Form2 : Form
{
public Form1 LaunchOrigin { get; set; }
// and so on
Run Code Online (Sandbox Code Playgroud)
现在,您可以在启动Form2时分配LaunchOrigin成员.这是一个例子:
Form2 newForm = new Form2();
newForm.LaunchOrigin = this;
newForm.Show();
Run Code Online (Sandbox Code Playgroud)
您现在可以访问Form1及其所有成员.这是一个简单的例子:
private void Form2_Load(object sender, EventArgs e)
{
this.Text = LaunchOrigin.Text;
}
Run Code Online (Sandbox Code Playgroud)
您必须记住,控件被声明为私有,因此您无法直接访问它们.你可以在Form1上写一个引用该控件的属性,但这通常是个坏主意.但是,为了完整起见,这里有一些代码可用于公开Form1上的按钮:
public partial class Form1 : Form
{
public Button theButton;
public Form1()
{
InitializeComponent();
theButton = button1; // where button1 is what I dragged on
}
// and so on
Run Code Online (Sandbox Code Playgroud)
虽然你所要求的相对容易实现,但它会让你走上一些脆弱的应用程序结构.仔细想想你试图在表单之间展示什么,也许它应该是一个可以绑定到两个表单的独特类型,这样一旦你改变了底层类型,你就可以改变两者的表示.
有很好的方法可以做到这一点和丑陋的方式来做到这一点......从UGLY开始:
其中一个最丑陋的方法是将Form1的引用传递给Form2的构造函数,然后将该引用存储为字段以供日后使用.它很讨厌,因为它在两者之间产生了非常紧密的耦合.更改Form1的界面或行为会影响Form2.
一个不那么难看但仍然是hackish的方法是将Form1中的字符串值传递给Form2的构造函数 - 或者Form2上的一些公共/内部方法.你仍然依赖于这些字符串,但至少它不是Form1和Form2的完全耦合.只是期望Form2总是有一个Form1来为它们提供这些字符串.
...在这里填写一些更讨厌的变化.
我建议你研究一个解决这个问题的应用程序范围的解决方案,而不是创建inter-objec依赖项.
创建一个适用于轻量级"pub/sub" - 或发布/订阅 - 模型的消息传递接口.我们的想法是,您的应用中有一些组件可以发布消息(您的字符串值 - 或更复杂的东西)以及您的应用中订阅消息的其他组件.
当Form 1启动时,它会在消息传递界面注册"嘿,我要发布这种类型的消息"(类型是你提供的一些指示).当表单2启动时,它会向消息传递接口注册"Yo,当有人发布此类消息时,将其传递给我".
发布者和订阅者都实现了一些已知的接口,以便您的消息处理程序可以与它们通信(IPublisher,ISubscriber) - 并接收/发送消息.如果有必要,一个组件既不是发布者也不是订阅者(基本上将系统中的对象视为"同伴"或"同事")是没有理由的.一些MessageReceived事件和一些代码来管理一组发布者/订阅者和你'好好去.
有关更多详细信息,请查看Mediator模式,其中更详细地描述了此类解决方案.