2016-03-24 3 views
-2

У меня есть приложение для Windows, которое имеет основную форму (главный экран) и множество подформ.System.ObjectDisposedException при закрытии формы

Если подформация закрыта и снова вызвана из основной формы, возникает исключение System.ObjectDisposedException.

Ниже мой экран кода перечислены:

Главного код экрана вызова Подчиненный:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace Application 
{ 
    public partial class Home : Form 
    { 

     private void Businesslogic_button_Click(object sender, EventArgs e) 
     { 
      BusinessRules.Show(); 
     } 

    } 
} 

Подформ designer.cs код для размещения объектов:

protected override void Dispose(bool disposing) 
{ 
    if (disposing && (components != null)) 
    { 
     components.Dispose(); 
    } 

    base.Dispose(disposing); 
} 

Подформа .cs кода событие закрытия формы:

bool formClosing false; 
private void BusinessRules_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     if (formClosing) return; 
     e.Cancel = true; 
     Timer Tmr = new Timer(); 
     Tmr.Tick += Tmr_Tick; 
     Tmr.Start(); 
     formClosing = true; 
    } 

    void Tmr_Tick(object sender, EventArgs e) 
    { 
     ((Timer)sender).Stop(); 
     this.Close(); 
    } 
+4

Какова цель таймера в 'BusinessRules_FormClosing'? –

+1

Кроме того, вы не показываете, как вы закрываете и повторно открываете подформу в любом из кода, который вы отправили –

+2

Где вы создаете 'BusinessRules'? Я подозреваю, что вы создаете его один раз в каком-то месте, например 'Home_Load', а затем каждый раз используете один и тот же экземпляр. Поскольку вы закрываете форму «BusinessRules», а не просто скрываете ее, она становится удаленной, а затем вы вызываете «Show()» на расположенной форме – Rhumborl

ответ

2

Если вам нужно сохранить состояние формы, просто вызовите метод Hide() и установите e.Cancel = верно. Затем просто вызовите Show() в переменной формы, чтобы снова открыть его.

Если вы не хотите сохранять состояние, просто закройте форму. И откройте новый экземпляр формы с вашей главной страницы.

+0

Привет ... Просто быстрый вопрос .... Как создать новый экземпляр для подформы каждый раз, когда он закрывается X ......? –

+0

Я думаю, у вас уже есть код для этого в вашей основной форме? Подобно 'var businessRulesForm = new BusinessRulesForm(); businessRulesForm.Show(); ' – ManoDestra

+0

Прошу прощения ... да спасибо .... –

1

Попробуйте это в Subform.CS:

private void Subform_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     e.Cancel = true; 
     this.Hide(); 
    } 
+0

Я знаю этот код, который скроет форму ... но не закрывает ее ... когда я снова нажимаю форму он откроется со значениями в предыдущем сеансе. –

Смежные вопросы