Форма Dispose () или Close () - PullRequest
       1

Форма Dispose () или Close ()

5 голосов
/ 19 января 2010

У меня есть 2 формы. Из одной формы я создал и показал другую форму. Работает отлично. Но когда я пытаюсь закрыть или удалить эту форму из формы, которая ее создала, я получаю следующее исключение:

Exception :
   Value Dispose() cannot be called while doing CreateHandle().

Stack Trace :
========================
   at System.Windows.Forms.Control.Dispose(Boolean disposing)
   at System.Windows.Forms.Label.Dispose(Boolean disposing)
   at System.ComponentModel.Component.Dispose()
   at System.Windows.Forms.Control.Dispose(Boolean disposing)
   at System.Windows.Forms.ContainerControl.Dispose(Boolean disposing)
   at System.Windows.Forms.Form.Dispose(Boolean disposing)
   at Speedometer_Application.frmSpeedometer.Dispose(Boolean disposing) 

Любая идея ????

Ответы [ 4 ]

17 голосов
/ 01 октября 2012

Ошибка Value Close() cannot be called while doing CreateHandle() обычно возникает, когда мы пытаемся закрыть форму в конструкторе или событие Load.

Например, следующий код выдает ошибку:

private void frmCustomer_Load(object sender, EventArgs e)
{
 if (!Valid())
  this.Close;
}

Решение:

private void frmCustomer_Load(object sender, EventArgs e)
{
 if (!Valid())
  this.BeginInvoke(new MethodInvoker(Close));
} 

Вы можете использовать это в своем коде.

1 голос
/ 19 января 2010

Трудно сказать, в чем проблема из кода, который вы разместили.

Код, который вы опубликовали, должен работать (форму, показанную с помощью Show (), можно закрыть методом Dispose ()).

Причина, по которой это не работает, вероятно, где-то в той форме, которую вы пытаетесь устранить. Когда вы вызываете метод Dispose () (согласно сообщению об ошибке, это то, что происходит) для объекта, этот объект попытается избавиться от всех своих дочерних элементов и выполнить некоторую очистку. Это место, где нужно искать ошибки.

Мое предложение состоит в том, чтобы закомментировать весь ваш код в форме objfrm (или создать новую пустую форму) и посмотреть, если произойдет ошибка. Этого не должно быть. Затем начните добавлять закомментированный код и посмотрите, когда произойдет ошибка. Могу поспорить, что это будет в коде, который вызывается как следствие метода Dispose.

0 голосов
/ 19 января 2010

Вам нужно использовать ShowDialog вместо Показать , вот в чем проблема.Show dont блокирует приложение, и код продолжает работать.

Вы удаляете объект, когда GUI его создает (то, что говорит исключение)

Попробуйте с этим:

if (frmMain.objfrm== null)
{   
     frmMain.objfrm = frmMyForm.Instance;     
     frmMain.objfrm.ShowInTaskbar = false;    
}
frmMain.objfrm.ShowDialog();

Обратите внимание на ShowDialog ()

0 голосов
/ 19 января 2010

Код выглядит следующим образом:

if (frmMain.objfrm== null)
{   
     frmMain.objfrm = frmMyForm.Instance;     
     frmMain.objfrm.ShowInTaskbar = false;    
}
frmMain.objfrm.Show();
frmMain.objfrm.BringToFront();

frmMain - это основная форма со статической переменной frmMyForm. чем в моем коде, где бы я ни хотел использовать это, я просто проверяю, не является ли оно нулевым, чем создаю его с помощью статического экземпляра и затем даю peoperty.

При закрытии формы у меня есть следующий код:

frmMain.objfrm.Close_this();

Close_this вызывает метод Close () или Dispose ().

Но когда я вызываю эту функцию, я получаю указанное выше исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...