如何使多种形式工作?
How to make many forms working?
我有一个包含许多表单的应用程序,用户可以从任务栏中 运行。但是当用户 运行 的 2 个表单时,只有最后一个会起作用,直到他关闭它。第二个窗体关闭后,第一个窗体又开始工作了。
如何使许多表单一直工作,就像 window 中的其他程序一样(例如,同一个 Web 浏览器的许多 windows)?
这是我在网上找到的部分代码,我用它来显示和隐藏表单。
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();
}
问题是您必须使用 Show() 而不是 ShowDialog() 以便父窗体和其他窗体也可以单击。
同样去掉方法中的using,因为using里面的语句执行完后,using会处理掉新的form,导致form消失。
void ShowSms(object sender, EventArgs e)
{
SmsForm sm = new SmsForm();
if (sm.Visible)
sm.Focus();
else
sm.Show();
}
编辑: 根据新信息更新了答案
您不需要 using 创建表单,因为 using 基本上是这样做的:
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 class 中有某些东西需要处理,比如打开数据库连接或其他东西,那么在您使用 Disposable 的 class/method 中使用 using
目的。
我有一个包含许多表单的应用程序,用户可以从任务栏中 运行。但是当用户 运行 的 2 个表单时,只有最后一个会起作用,直到他关闭它。第二个窗体关闭后,第一个窗体又开始工作了。
如何使许多表单一直工作,就像 window 中的其他程序一样(例如,同一个 Web 浏览器的许多 windows)?
这是我在网上找到的部分代码,我用它来显示和隐藏表单。
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();
}
问题是您必须使用 Show() 而不是 ShowDialog() 以便父窗体和其他窗体也可以单击。
同样去掉方法中的using,因为using里面的语句执行完后,using会处理掉新的form,导致form消失。
void ShowSms(object sender, EventArgs e)
{
SmsForm sm = new SmsForm();
if (sm.Visible)
sm.Focus();
else
sm.Show();
}
编辑: 根据新信息更新了答案
您不需要 using 创建表单,因为 using 基本上是这样做的:
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 class 中有某些东西需要处理,比如打开数据库连接或其他东西,那么在您使用 Disposable 的 class/method 中使用 using
目的。