繁体   English   中英

在C#问题中显示表格?

[英]Showing a form in c# issue?

我有3种形式。 frm1frm2frm3 我想显示frm3frm2 frm1 ,而不创建它的新实例。 我只是想始终显示frm3的实际形式,而不是它的新实例:

我在Frm1中尝试过的示例:

frm3 f3 = new frm3()
f3.showDialog();

在Frm2中:

frm3 f3 = new frm3();
f3.showDialog(); 

但是我不frm3我尝试的那样显示frm3 ,我想要实际的形式而不是新的实例?

一种方法是向frm1frm2都添加类型为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM