2012-09-25 44 views
2

我有一個在C#中開發的Microsoft Word外接程序。當用戶嘗試關閉具有未保存更改的文檔時,將顯示保存對話框。如果用戶點擊保存對話框上的取消,有沒有辦法捕獲?從保存對話框捕獲取消狀態,以便關閉未保存更改的MS Word文檔

在顯示保存對話框之前DocumentBeforeClose事件被激怒,並且它看起來事件沒有被觸發,封裝了保存對話框事件。

爲什麼我需要這個: 如果用戶關閉了最後一個文檔,我需要在我的加載項工具欄上進行一些清理。但是,如果我在DocumentBeforeClose事件中進行清理並且用戶單擊取消,則加載項工具欄狀態不正確。

編輯/更新:

正如羅布·艾倫建議,我現在使用的關閉事件爲我的父對象的預驗證接近我做父對象的清理和BeforeClose事件。我的驗證需要保存文檔並嘗試在BeforeClose調用的方法中執行此操作。如果文檔之前從未保存過,則會出現另存爲對話框。如果用戶單擊Cancel,則拋出COMException並且我可以捕獲該異常。然後出現保存/不保存/取消對話框。 如果用戶單擊「不保存」,則不會觸發ShutDown事件。如果用戶從「另存爲」對話框保存,從第二個對話框保存或在第二個對話框中點擊取消,則所有功能都可以正常工作。

private void WordDocument_BeforeClose(object sender, System.ComponentModel.CancelEventArgs e) 
{ 
    try 
    { 
    this.WordDocument.Save(); 
    } 
    catch (System.Runtime.InteropServices.COMException a) 
    { 
    log.Error(a.Message); 
    } 
} 

private void WordDocument_Shutdown(Object sender, EventArgs e) 
{ 
    // Parent cleanup. 
} 

回答

2

請嘗試文檔關閉事件。文檔here

從「備註」部分:

這是一個文件被調用,因爲它卸載的最後一個事件。使用此事件進行任何額外清理。

在文檔級自定義中,程序集的應用程序域在文檔主機項關閉時卸載。

在應用程序級加載項中,當文檔主機項關閉時,應用程序域不會卸載。此外,底層文檔對象不再可用。要在關閉文檔之前訪問文檔,請改用CloseEvent。

+0

在我需要的時候,關機似乎被解僱了。但是,當我嘗試訪問(Microsoft.Office.Tools.Word.Document)文檔的任何屬性時,都會有一個基礎COM異常,指出「對象已被刪除」。我想這是有道理的......但是,我希望使用文檔的名稱,以便我可以從活動文檔列表中刪除名稱。任何方式在這個? –

+0

您是否需要真正瞭解打開的文檔,或者是Word的Application.Quit方法觸發足夠的數量 –

+0

或者甚至可以計算一般打開文檔的數量 –