2016-08-02 6 views
0

У меня есть приложение со многими формами, которые пользователь может запускать из поддона. Но когда пользователь запускает 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(); 
    } 
+0

Попробуйте использовать 'Show()' вместо 'ShowDialog()' при открытии новой формы –

+0

Да, это было первое, что я сделал. Но окно показывает, а затем сразу исчезает. – AnotherSimpleName

+0

'Show' верен. Если вам нужна помощь в ее работе, попробуйте создать [mcve] –

ответ

1

Проблема в том, вы должны использовать Show() вместо ShowDialog(), так что родительская форма и другие формы также интерактивными.

Также удалите использование из метода, потому что использование удаляет новую форму после выполнения операторов внутри использования, что приводит к исчезновению формы.

void ShowSms(object sender, EventArgs e) 
{ 
    SmsForm sm = new SmsForm();     
    if (sm.Visible) 
    sm.Focus(); 
    else 
    sm.Show(); 
} 

EDIT: Обновленный ответ на новую информацию

Вам не нужно, используя для создания формы, так как, используя в основном делает это:

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, которое нужно удалить, например, открытие соединения с БД или что-то, чем использование using в этом классе/методе, где вы используете одноразовый объект.

+0

Да, таким образом он работает. Но что мне делать, если мне нужно «использовать» заявление? – AnotherSimpleName

+0

Вы хотите избавиться от формы? Отправление должно быть удалено, если оно закрыто, если форма не была вызвана как модальное диалоговое окно (с помощью ShowDialog() '), поэтому с вами все будет в порядке. Посмотрите на этот ответ http://stackoverflow.com/questions/3097364/c-sharp-form-close-vs-form-dispose –

+0

Нет, я использую «использование» для запуска формы, потому что у меня есть 2 возможности форм. Если у меня есть соединение с базой данных, я запускаю форму с UnitOfWork, если у меня ее нет, я запускаю форму с базовым конструктором. – AnotherSimpleName