在c#问题中显示表单?

时间:2015-06-17 05:53:25

标签: c#

我有3个表格。 frm1frm2frm3。我想在frm3frm1显示frm2而不创建新的实例。只是我想显示frm3总是实际的形式而不是它的新实例:

示例我在Frm1中尝试过:

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

在Frm2中:

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

但我不想像我尝试的那样展示frm3,我希望实际的形式不是新的实例?

5 个答案:

答案 0 :(得分:2)

一种方法是向frm3frm1添加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();
}

检查一次。