2016-06-28 9 views
2

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.

+1

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

+0

Richtig, aber es sollte zu dieser Zeit nicht schließen. –

+0

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? –

Antwort

4

Sie haben Ihren Code an die falsche Stelle gesetzt. :-) Es scheint so, als hättest du missverstanden, was Aktivierung und Deaktivierung bedeuten (zumindest was Windows betrifft).

Die Deaktivierung erfolgt immer dann, wenn ein anderes Fenster aktiviert wird. Wenn das Formular zerstört wird, muss ein anderes Fenster aktiviert werden, auch wenn es sich um den Windows-Desktop handelt. FormDeactivate kann mehrmals aufgerufen werden (z. B. wenn der Benutzer zu einer anderen App oder sogar zu einem anderen Fenster in der eigenen App wechselt). Es ist wichtig zu beachten, dass dies auch für Aktivierung gilt; FormActivate kann auch mehrere Male ausgelöst werden.

Wenn Sie möchten, dass Code ausgeführt wird, wenn Ihr Formular geschlossen wird, fügen Sie es stattdessen in den Ereignishandler FormClose ein.