首先,我想澄清类似这样的问题,已经在stackoverflow中提出,但没有一个解决了我的问题。因此,在您将问题标记为重复之前,请先了解我的问题。
我有两个form
名为frmNewCustomer
和frmCustomers
。在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)
。所以,我必须btnNewCustomer
在form
内打开Form1
。如果我再次单击Form1
的文件菜单并尝试打开frmCustomers
,则不会打开新表单,只会在focus
打开的实例上frmCustomers
很好。这样我就可以在focus
上frmNewCustomers
。
现在,如果我在frmCustomers
打开时关闭frmNewCustomer
,请再次打开frmCustomers
,然后点击{{1},在已打开的focus
上尝试frmNewCustomers
它不起作用。它会打开一个我不想要的新btnNewCustomer
。我只是想专注于frmNewCustomer
的打开实例。我该怎么做才能解决我的问题?我附上屏幕截图,以便您更好地了解我的问题。
答案 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();
}