如果表单已在winForm中打开,如何打开表单?

时间:2018-03-06 02:35:51

标签: c# .net winforms

首先,我想澄清类似这样的问题,已经在stackoverflow中提出,但没有一个解决了我的问题。因此,在您将问题标记为重复之前,请先了解我的问题。

我有两个form名为frmNewCustomerfrmCustomers。在frmCustomers内,我有一个名为button的{​​{1}}控件,只要我点击btnNewCustomer,就会打开frmNewCustomer。这两个表单是另一个名为button的表单的MdiChildren。现在,如果它已经打开,我不想打开WMS。为此,我所做的就是这个(form的代码)。

frmCustomers

现在假设,我从主namespace WMS.Presentation { public partial class frmCustomers : Form { Form newCustomer = new frmNewCustomer(); public frmCustomers() { InitializeComponent(); } private void btnNewCustomer_Click(object sender, EventArgs e) { if (newCustomer.IsDisposed) newCustomer = new frmNewCustomer(); newCustomer.MdiParent = this.MdiParent; newCustomer.Show(); newCustomer.BringToFront(); } } } 菜单中打开了表单frmCustomers。之后我点击按钮form (Form1)。所以,我必须btnNewCustomerform内打开Form1。如果我再次单击Form1的文件菜单并尝试打开frmCustomers,则不会打开新表单,只会在focus打开的实例上frmCustomers很好。这样我就可以在focusfrmNewCustomers

现在,如果我在frmCustomers打开时关闭frmNewCustomer,请再次打开frmCustomers,然后点击{{1},在已打开的focus上尝试frmNewCustomers它不起作用。它会打开一个我不想要的新btnNewCustomer。我只是想专注于frmNewCustomer的打开实例。我该怎么做才能解决我的问题?我附上enter image description here屏幕截图,以便您更好地了解我的问题。

3 个答案:

答案 0 :(得分:0)

有许多积极主动和反应性的方式来做到这一点

但是,您可以使用类似的内容,如果Form处于打开状态,则会重新激活public void OpenExclusive<T>(Form parent) where T : Form, new() { foreach (Form form in Application.OpenForms) { if (form.GetType() == typeof(T)) { form.Activate(); return; } } Form newForm = new T(); newForm.MdiParent = parent; newForm.Show(); } ,如果不是,则会重新激活。

OpenExclusive<MyForm>(this);

用法

var array = new[] { 1, 4, 7, 3, -3, -4, -1, 4, 2, 1 };

var descending_subarrays =
    array
        .Skip(1)
        .Aggregate(new [] { array.Take(1).ToList() }.ToList(), (a, x) =>
        {
            if (a.Last().Last() > x)
            {
                a.Last().Add(x);
            }
            else
            {
                a.Add(new [] { x }.ToList());
            }
            return a;
        })
        .OrderByDescending(x => x.Count)
        .ToList();

注意 :写在SO上并且完全未经测试

答案 1 :(得分:0)

尝试使用此表格关闭newCustomer表单,同时关闭frmCustomers表单。

namespace WMS.Presentation
{
    public partial class frmCustomers : Form
    {

        Form newCustomer = new frmNewCustomer();

        public frmCustomers()
        {
            InitializeComponent();

            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(FormClosing);
        }


        private void btnNewCustomer_Click(object sender, EventArgs e)
        {
            if (newCustomer.IsDisposed)
                newCustomer = new frmNewCustomer();

            newCustomer.MdiParent = this.MdiParent;
            newCustomer.Show();
            newCustomer.BringToFront();
        }

        private void FormClosing(object sender, EventArgs e)
        {
            if (!newCustomer.IsDisposed)
                newCustomer.Close();
        }
    }
}

注意:写在SO上。没试过。请进行必要的更改。

答案 2 :(得分:0)

编写一个函数,通过其类名查找打开的表单,如果找到则打开它,并在最小化时恢复它。
当函数返回false时,表单将不会打开,您可以第一次打开 这适用于我的winforms应用程序

public bool CheckIfFormIsAlreadyOpen(string className)
{
    bool Result = false;
    className = className.ToUpper();

    int i = 0;
    while ((i < Application.OpenForms.Count) && (Application.OpenForms[i].Name.ToUpper() != className))
    {
        i++;
    }
    if (i < Application.OpenForms.Count)
    {
        Application.OpenForms[i].Show();
        Application.OpenForms[i].BringToFront();
        if (Application.OpenForms[i].WindowState == FormWindowState.Minimized)
        {
           ShowWindowAsync(Application.OpenForms[i].Handle, 9); // 9 = SW_RESTORE
        }

        Result = true;
    }

    return Result;
}

用法:

if (!CheckIfFormIsAlreadyOpen("frmCustomers"))
{
    frmCustomers form = new frmCustomers();
    form.MdiParent = this.MdiParent;
    form.Show();
}