我有3个表格。 frm1
,frm2
和frm3
。我想在frm3
和frm1
显示frm2
而不创建新的实例。只是我想显示frm3总是实际的形式而不是它的新实例:
示例我在Frm1中尝试过:
frm3 f3 = new frm3()
f3.showDialog();
在Frm2中:
frm3 f3 = new frm3();
f3.showDialog();
但我不想像我尝试的那样展示frm3
,我希望实际的形式不是新的实例?
答案 0 :(得分:2)
一种方法是向frm3
和frm1
添加frm2
类型的公共属性。
public frm3 Form3 {get; set;}
然后创建frm3
的实例并在frm1和frm2上设置属性,以便它们可以使用相同的实例。
e.g。在Sub Main
frm1 f1 = new frm1();
frm2 f2 = new frm2();
frm3 f3 = new frm3();
frm1.Form3 = f3;
frm2.Form3 = f3;
然后在frm2和frm1中你可以使用
this.Form3.ShowDialog();
请注意,您需要注意不要同时尝试从frm1和frm2操作frm3的实例。你可能会遇到错误。
答案 1 :(得分:1)
如果没有全局变量或其他结构,您可以完全动态完成此操作。也不必更改任何当前的表单代码。
public void CreateOrActivateForm<T>() where T : Form
{
IEnumerable<T> openForms = Application.OpenForms.OfType<T>();
if (openForms.Any())
{
foreach (T openForm in openForms)
{
openForm.Activate();
}
}
else
{
Form form = (T)Activator.CreateInstance(typeof(T));
form.Show();
}
}
public void OpenForm2()
{
CreateOrActivateForm<Form2>();
}
将其置于帮助者手中。您可以激活打开表单或创建新表单。
如果你只想获得Form2&#39;:
Form2 form2 = Application.OpenForms.OfType<Form2>().Cast<Form2>().FirstOrDefault();
答案 2 :(得分:0)
把它放在一个全局变量中试试这个,
public partial class Form1 : Form
{
public Form1() {
InitializeComponent();
globalvars.ref_Form1 = this;
}
}
public static class globalvars { public static Form1 ref_Form1; }
现在您可以从globalvars.ref_Form1
访问它。
答案 3 :(得分:0)
如果你不希望每次想要显示它时都有一个新的表单实例,你可以在你的form1上有一个全局变量,你可以在你的form1加载时实现一次,然后显示它(frm2.showdialog )当需要时。
答案 4 :(得分:0)
使用这些代码行。
在表单类中添加构造函数和getter方法。
public partial class YourFormClass: Form
{
private static YourFormClass mInst;
private YourFormClass()
{
InitializeComponent();
}
public static YourFormClass CheckInst
{
get
{
return mInst;
}
}
public static YourFormClass CreateInst
{
get
{
if (mInst == null)
mInst = new YourFormClass();
return mInst;
}
}
protected override void OnClosed(EventArgs e)
{
mInst = null;
base.OnClosed(e);
}
}
之后检查已使用的表单实例
if (YourFormClass.CheckInst == null)
{
YourFormClass.CreateInst.Show();
YourFormClass.CreateInst.MdiParent = this;
}
else
{
YourFormClass.CreateInst.WindowState = FormWindowState.Normal;
YourFormClass.CreateInst.Focus();
}
检查一次。