Windows窗体无法正常关闭

时间:2012-10-30 20:28:16

标签: c# winforms refactoring add-in

我正在为outlook 2010开发一个加载项。
基本上,我的功能区上有一个按钮,用于选择所选的电子邮件,并将其保存到文本文件中。如果电子邮件包含某个主题,则保存将自动完成到硬编码文件路径。如果没有,则打开一个窗口表单,要求用户输入文件路径。

当用户选择了一个路径,然后单击“确定”时,保存就会发生,然后表单关闭......但随后重新打开...它似乎正在创建它的新实例。 ..如果我单击“取消”或“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();
}

我已经简化了这一点,因此更容易阅读。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

  • 考虑使用OpenFileDialog代替您的弹出窗体
  • 仅使用弹出窗口(或文件对话框)获取文件名
  • 将电子邮件保存在一个位置(否则您将拥有重复的代码)
  • 在进一步处理之前验证对话框表单的DialogResult
  • 表格是一次性的 - using声明会自动处理它们
  • 不要关闭对话框表单 - 将其设置为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; }
}