Ich habe eine Winforms App, die eine Excel-Tabelle mit Excel Interop generiert.Warum wird FormDeactivate aufgerufen, bevor das Formular geschlossen wird?
Als ich versuchte, das Blatt auf diese Weise zu speichern:
_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);
... es würde scheitern, mir zu sagen, "System.Runtime.InteropServices.InvalidComObjectException wurde nicht behandelt HResult = -2146233049 Message = COM-Objekt, das vom zugrunde liegenden RCW getrennt wurde, kann nicht verwendet werden "
Das hat nicht viel Sinn machen, obwohl - ich nichts zu tun Phantasie mit Fäden oder so. das ist ein ziemlich einfaches Vanille-Dienstprogramm. Die einzigen anderen Orten _xlBook im Code verwiesen wird, sind:
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);
Der letzte Teil, wo _xlBook der angeordnet ist, wurde von der Form des Deactivate-Ereignis genannt, das war:
private void FormMain_Deactivate(object sender, EventArgs e)
{
DeinitializeExcelObjects();
}
Das Problem war (was ich entdeckt, nachdem Stützpunkte in allen Orten setzen, wo _xlBook verwiesen wird), dass FormMain_Deactivate() wurde aufgerufen, bevor _xlBook.SaveAs() aufgerufen wird, das aufgerufen wird, wenn auf eine Schaltfläche "Ausführen" geklickt wird.
Sobald ich den Aufruf von DeinitializeExcelObjects() in FormMain_Deactivate() auskommentiert und es direkt nach dem Aufruf von _xlBook.SaveAs() aufgerufen hat, funktioniert es einwandfrei - die Datei wird erstellt und ohne Fehler msg gespeichert.
Warum wird FormDeactivate aufgerufen, bevor das Formular geschlossen wird? Wenn dies irgendwie "wie geplant" ist, wird das Ereignis schrecklich falsch benannt.
Nun 'Deactivate' heißt immer dann, wenn die' Form' den Fokus verliert, also steht es fest, dass es beim Schließen aufgerufen wird. Und es ist * konsistent mit der Methode 'Form.Aktivieren() '. – InBetween
Richtig, aber es sollte zu dieser Zeit nicht schließen. –
Was lässt Sie denken, dass es schließt? Macht der "Run" -Button mehr als nur 'SaveAs' aufzurufen? Ich kann mir vorstellen, dass ein Formular deaktiviert wird, wenn Sie beispielsweise den Benutzer nach einem Zieldateinamen fragen? –