[英]Showing a form in c# issue?
我有3种形式。 frm1
, frm2
和frm3
。 我想显示frm3
和frm2
frm1
,而不创建它的新实例。 我只是想始终显示frm3的实际形式,而不是它的新实例:
我在Frm1中尝试过的示例:
frm3 f3 = new frm3()
f3.showDialog();
在Frm2中:
frm3 f3 = new frm3();
f3.showDialog();
但是我不frm3
我尝试的那样显示frm3
,我想要实际的形式而不是新的实例?
一种方法是向frm1
和frm2
都添加类型为frm3
的公共属性。
public frm3 Form3 {get; set;}
然后创建frm3
的实例,并在frm1和frm2上设置属性,以便它们可以使用相同的实例。
例如在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的实例。 您可能会得到错误。
您可以完全动态地执行此操作,而无需全局变量或其他构造。 同样也不必更改任何当前的表单代码。
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>();
}
将其放在“ Helper”类中,您可以激活打开的表单或创建新表单。
如果您只想获取“ Form2”:
Form2 form2 = Application.OpenForms.OfType<Form2>().Cast<Form2>().FirstOrDefault();
将其放在全局变量中,尝试一下,
public partial class Form1 : Form
{
public Form1() {
InitializeComponent();
globalvars.ref_Form1 = this;
}
}
public static class globalvars { public static Form1 ref_Form1; }
现在您可以从globalvars.ref_Form1
访问它。
如果您不想每次显示表单时都拥有一个新的实例,则可以在form1上有一个全局变量,在您加载form1时实例化一次,然后在它显示时显示它(frm2.showdialog)是必须的。
使用这些代码行。
在表单类中添加构造函数和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();
}
检查一次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.