У меня есть приложение Winforms, которое создает электронную таблицу Excel с помощью Excel Interop.Почему FormDeactivate вызывается до закрытия формы?
Когда я попытался сохранить лист таким образом:
_xlBook.SaveAs(filename, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
... он потерпит неудачу, говоря мне, "System.Runtime.InteropServices.InvalidComObjectException было необработанное HResult = -2146233049 Message = COM-объект, который был отделен от его базового RCW, не может быть использован. «
Это не имело большого смысла, хотя - я не делал ничего интересного нитями или такими; это довольно простая утилита для ванили. Единственные другие места _xlBook ссылаются в коде:
1)
private Excel.Workbook _xlBook;
2)
_xlBook = _xlApp.Workbooks.Add(Type.Missing);
3)
_xlSheets = _xlBook.Worksheets;
_xlSheet = (Excel.Worksheet)_xlSheets.Item[1];
4)
_xlBook.Close(false);
Marshal.ReleaseComObject(_xlBook);
Это последняя часть, где _xlBook выбывает, была вызвана из Деактивировать события формы, которая была:
private void FormMain_Deactivate(object sender, EventArgs e)
{
DeinitializeExcelObjects();
}
Проблема заключалась в том (что я обнаружил после сдачи контрольных точек во всех местах, где ссылочные _xlBook), что FormMain_Deactivate() вызывается до Вызывается _xlBook.SaveAs(), который вызывается при нажатии кнопки «Выполнить».
После того, как я прокомментировал вызов DeinitializeExcelObjects() в FormMain_Deactivate() и вызвал его сразу после вызова функции _xlBook.SaveAs(), он отлично работает - файл создается и сохраняется без каких-либо ошибок msg.
Итак, почему FormDeactivate вызывается до того, как форма закрыта? Если это каким-то образом «спроектировано», событие ужасно прозвано.
Ну 'Деактивировать' вызывается в любое время, когда' Form' теряет фокус, поэтому разумно, что его вызывали при закрытии. И это * * согласуется с методом 'Form.Активировать() '. – InBetween
Правильно, но в это время он не должен закрываться. –
Что заставляет вас думать, что он закрывается? Кнопка «Запустить» делает больше, чем просто «SaveAs»? Я могу представить, что форма деактивируется, когда, например, вы запрашиваете у пользователя имя целевого файла? –