为什么在窗体关闭之前调用FormDeactivate ?
本文关键字:调用 FormDeactivate 窗体 为什么 | 更新日期: 2023-09-27 17:53:03
我有一个使用Excel互操作生成Excel电子表格的Winforms应用程序。
当我尝试这样保存表单时:
_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的最后一部分是从表单的Deactivate事件调用的,该事件为:
private void FormMain_Deactivate(object sender, EventArgs e)
{
DeinitializeExcelObjects();
}
问题是(这是我发现在把断点在所有地方_xlBook被引用),FormMain_Deactivate()被调用之前, _xlBook. savea()被调用,这是在"运行"按钮被点击时调用。
一旦我在FormMain_Deactivate()中注释掉对DeinitializeExcelObjects()的调用,并在调用_xlBook.SaveAs()之后调用它,它就能正常工作-文件被创建并保存,没有任何错误消息。
那么为什么在窗体关闭之前调用FormDeactivate呢?如果这在某种程度上是"按照设计的",那么事件的命名就大错特错了。
您把代码放在了错误的位置。:-)看来你误解了激活和停用的意思(至少就Windows而言)。
当一个不同的窗口被激活时,停用就会发生,很明显,当窗体被销毁时,一个不同的窗口必须被激活,即使那个窗口是Windows桌面。FormDeactivate可以被多次调用(比如当用户切换到不同的应用程序时,甚至是在你自己的应用程序中切换到不同的窗口时)。需要注意的是,这也适用于激活;FormActivate也可以多次触发。
如果您希望代码在窗体关闭时运行,请将其放在FormClose事件处理程序中。