【问题标题】:How to make many forms working?如何让多种形式发挥作用?
【发布时间】:2016-08-02 07:00:18
【问题描述】:

我有一个包含许多用户可以从托盘运行的表单的应用程序。但是当用户运行 2 个表单时,只有最后一个可以工作,直到他关闭它。第二个表单关闭后,第一个表单又开始工作了。

如何让多个表单一直工作,就像窗口中的其他程序一样(例如,同一个网络浏览器的多个窗口)?

这是我在互联网上找到的部分代码,我用它来显示和隐藏表单。

        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()
  • 是的,这是我做的第一件事。但是窗口显示然后立即消失。
  • Show 是正确的。如果您需要帮助使其正常工作,请尝试创建minimal reproducible example

标签: c# winforms tray


【解决方案1】:

问题是您必须使用 Show() 而不是 ShowDialog() 以便父表单和其他表单也可以单击。

同样去掉方法中的using,因为using里面的语句执行完后新表单的using处理,导致表单消失。

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

【讨论】:

  • 是的,这样就可以了。但是如果我需要“使用”语句,我该怎么办?
  • 您的意思是处理表单?如果表单没有被调用为模式对话框(使用ShowDialog()),则应在关闭时处理 From,因此不使用它应该没问题。看这个答案stackoverflow.com/questions/3097364/…
  • 不,我使用“使用”来运行表单,因为我有 2 种可能的表单。如果我有数据库连接,我正在使用 UnitOfWork 运行表单,如果我没有,我正在使用基本构造函数运行表单。
  • “两种形式的可能性”是什么意思? 2 相同表单类型的构造函数?或者您是否在表单内部检查您是否有数据库连接,然后以不同的方式执行它们?
  • 我有 2 个构造函数 - 一个带参数 (UnitOfWork),一个不带参数。在 MyApplicationContext 中,我正在检查我是否有数据库连接,然后我正在调用一个构造函数。所以每次用户想要运行例如。 SmsForm,我的程序检查我是否有数据库连接。
猜你喜欢
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
相关资源
最近更新 更多