使窗体实例成为公有c#
本文关键字:窗体 实例 | 更新日期: 2023-09-27 18:14:35
我试图将信息从子窗体传递到父窗体。我一直在使用我在论坛上找到的以下代码来帮助我:
Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace childform
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 tempDialog = new Form2(this);
tempDialog.ShowDialog();
}
public void msgme()
{
MessageBox.Show("Parent Function Called");
}
}
}
Form2.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace childform
{
public partial class Form2 : Form
{
private Form1 m_parent;
public Form2(Form1 frm1)
{
InitializeComponent();
m_parent = frm1;
}
private void button1_Click(object sender, EventArgs e)
{
m_parent.msgme();
}
}
}
这是有效的,一切都很好。问题是,我的程序要求我在tempDialog中设置变量,从Form 1,在方法中而不是button1_Click。但是,这些无法找到tempDialog的实例,因为它在button1_click中。
此外,我不能将其移出方法(例如,进入类),因为这样'this'修饰符不会引用Form1…
我如何从Form2引用Form1,反之亦然?使用这个代码还是其他方式?
谢谢
我不确定你最后关于this
的评论是什么意思。创建一个引用Form2
的字段,并在构造函数中初始化它。然后在Form1
的其他方法中引用_form2
。
public partial class Form1 : Form
{
private Form2 _form2;
public Form1()
{
InitializeComponent();
_form2 = new Form2(this);
}
private void button1_Click(object sender, EventArgs e)
{
_form2.ShowDialog();
}
}
当复杂性增加时,这种事情会变得难以理解。一种更好的方法可能是让Form1
和Form2
引用一些它们都可以操作的公共对象。
您可以尝试研究窗体对象上的MdiParent和Parent属性。它们允许您获取和设置父类,并在需要时访问它们的方法。
详细信息请参见MSDN上的Parent属性和MdiParent属性。
根据你的应用,如果你只有一个表单的副本,你在你的应用中显示和隐藏,你可能只能做一个单例静态引用。这将只工作,如果你只实例化表单一次,然而,然后使用show()
/hide()
在它上使它消失或根据需要重新出现。
public partial class Form2 : Form
{
public static Form2 Instance;
public Form2()
{
InitializeComponent();
this.Instance = this;
}
}
然后,您可以使用以下代码从任何地方访问表单2:
Form2.Instance.xxx