我有一个应用程序,有许多表单,用户可以从托盘运行。但是当用户运行2个表单时,只有最后一个表单才能运行,直到他关闭它。第二个表单关闭后,第一个表单再次运行。
如何使许多表单一直在工作,就像窗口中的其他程序一样(例如,同一个Web浏览器的许多窗口)?
以下是我在互联网上找到的代码的一部分,我将其用于显示和隐藏表单。
public MyApplicationContext()
{
MenuItem SmsMenuItem = new MenuItem("SMS", new EventHandler(ShowSms));
MenuItem ExitMenuItem = new MenuItem("Wyjdź", new EventHandler(Exit));
MenuItem HistoryMenuItem = new MenuItem("Historia", new EventHandler(ShowHistory));
NotifyIcon notifyIcon = new NotifyIcon();
notifyIcon.Icon = SMSapp.Properties.Resources.Icon1;
notifyIcon.ContextMenu = new ContextMenu(new MenuItem[] { SmsMenuItem, HistoryMenuItem, ExitMenuItem });
notifyIcon.Visible = true;
}
void ShowSms(object sender, EventArgs e)
{
if (Globals.globals.Set.DBConn)
{
UnitOfWork uow = new UnitOfWork();
using (SmsForm sm = new SmsForm(uow))
{
if (sm.Visible)
sm.Focus();
else
sm.ShowDialog();
}
}
else
{
using (SmsForm sm = new SmsForm())
{
if (sm.Visible)
sm.Focus();
else
sm.Show();
}
}
}
void ShowHistory(object sender, EventArgs e)
{
if (Globals.globals.Set.DBConn)
{
UnitOfWork uow = new UnitOfWork();
using (HistoryForm sm = new HistoryForm(uow))
{
if (sm.Visible)
sm.Focus();
else
sm.ShowDialog();
}
}
else
{
using (HistoryForm sm = new HistoryForm())
{
if (sm.Visible)
sm.Focus();
else
sm.ShowDialog();
}
}
}
void Exit(object sender, EventArgs e)
{
notifyIcon.Visible = false;
Application.Exit();
}
答案 0 :(得分:1)
问题是您必须使用Show()而不是ShowDialog(),以便父窗体和其他窗体也可以单击。
同样从方法中删除使用,因为在使用中的语句执行后使用处理新表单,这使表单消失。
void ShowSms(object sender, EventArgs e)
{
SmsForm sm = new SmsForm();
if (sm.Visible)
sm.Focus();
else
sm.Show();
}
编辑:更新了有关新信息的答案
您不需要使用创建表单,因为使用基本上是这样做的:
try{
SmsForm sm = new SmsForm();
//some code
}
finally{
sm.Dispose();
}
我会这样做:
void ShowSms(object sender, EventArgs e)
{
SmsForm sm;
if (Globals.globals.Set.DBConn)
{
UnitOfWork uow = new UnitOfWork();
sm = new SmsForm(uow);
}
else
sm = new SmsForm();
if (sm.Visible)
sm.Focus();
else
sm.Show();
}
现在,如果您的UnitOfWork类中有某些东西需要处理,比如打开数据库连接或者使用那个使用Disposable对象的类/方法中的using
。