0

Outlook 2010のアドインを開発しています。
基本的に、選択した電子メールを取得してテキストファイルに保存するボタンがリボンにあります。電子メールに特定の件名が含まれている場合、ハードコードされたファイルパスに自動的に保存されます。そうでない場合は、Windowsフォームが開き、ユーザーにファイルパスの入力を求めます。

ユーザーがパスを選択し、[OK]をクリックすると、保存が行われ、フォームが閉じます...しかし、再び開きます...新しいインスタンスなどを作成しているようです... [キャンセル]または[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();
}

これをかなり簡略化したので、読みやすくなっています。どんな助けでも大歓迎です。

4

1 に答える 1

1
  • OpenFileDialogポップアップフォームの代わりに使用することを検討してください
  • ポップアップ(またはファイルダイアログ)は、ファイル名を取得するためにのみ使用してください
  • メール保存コードを1か所に保管してください(そうしないと、コードが重複してしまいます)
  • 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; }
}
于 2012-10-30T21:07:04.743 に答える