2012-10-30 114 views
0

我正在開發Outlook 2010的加載項。
基本上,我的功能區上有一個按鈕,它將選定的電子郵件並將其保存到文本文件中。如果電子郵件包含某個主題,則保存將自動完成到硬編碼的文件路徑。如果沒有,則打開一個窗體窗體,要求用戶輸入文件路徑。Windows窗體將無法正常關閉

當用戶選擇了一個路徑,並點擊'確定'保存發生,然後窗體關閉...但它然後重新打開...它似乎是創建一個新的實例或東西...如果我點擊'取消'或'X'關閉,但我不明白爲什麼它第一次沒有正確關閉。

下面是我的代碼

//This is myRibbon.cs 
private void btn_SaveFile_Click(object sender, RibbonControlEventArgs e) 
{ 
    //other code 
    if (subject = "xyz") 
    { 
     //other code 
     textFile.Save(); 
    } 
    else 
    { 
     MyPopup popup = new MyPopup(); 
     popup.ShowDialog(); 
    } 
} 

//This is MyPopup.cs 
private void btnOK_Click(object sender, EventArgs e) 
{ 
    var filePath = txtFilePath.Text; 
    if (!string.IsNullOrWhiteSpace(filePath)) 
    { 
     SaveEmailToText(filePath); 
     this.Close(); 
    } 
    else 
    { //show message box with error } 
    this.Close(); 
} 

private static void SaveEmailToText(string filePath) 
{ 
    //other code 
    textFile.Save(); 
} 

我簡化了這個頗有幾分所以它更容易閱讀。 任何幫助將不勝感激。

+0

您需要關閉或處置通過檢查DialogModalResult ..是什麼似乎缺少的形式,你可以顯示MyPopup如何被聲明..?它不在表格上Initialize是..? – MethodMan

回答

1
  • 考慮使用OpenFileDialog而不是你彈出的形式
  • 的使用您的彈出(或文件對話框),僅用於獲取文件名
  • 保持電子郵件在一個地方可以節省代碼(否則你將重複的代碼)
  • 驗證對話框形式的DialogResult,處理進一步
  • 形式之前都是一次性的 - using聲明將自動處理它們
  • 不要關閉d ialog形式 - 設置它的DialogResult屬性,而不是

這裏被重構代碼:

private void btn_SaveFile_Click(object sender, RibbonControlEventArgs e) 
{ 
    string filePath = defaultPath; 

    if (subject != "xyz") 
    { 
     using(MyPopup popup = new MyPopup()) 
     { 
     // user can close popup - handle this case 
     if (popup.ShowDialog() != DialogResult.OK) 
      return; 
     filePath = popup.FilePath; 
     } 
    }  

    SaveEmailToText(filePath); 
} 

private void SaveEmailToText(string filePath) 
{ 
    //other code 
    textFile.Save(); 
} 

而你彈出,這應該與OpenFileDialog更換:

private void btnOK_Click(object sender, EventArgs e) 
{ 
    if (string.IsNullOrWhiteSpace(FilePath)) 
    { 
     //show message box with error 
     DialogResult = DialogResult.Cancel; 
     return; 
    } 

    // you can assign default dialog result to btnOK in designer 
    DialogResult = DialogResult.OK; 
} 

public string FilePath 
{ 
    get { return txtFilePath.Text; } 
} 
+0

謝謝你的幫助,我會試一試,看看我如何繼續。 – jonahpup