2012-10-30 49 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