none
C#のOutlookのVSTOでMailItemのイベントついて RRS feed

  • 質問

  • いつも助けていただいてありがとうございます。

    Visual Studio 2015 Professionalのc#で、Offie(Outlook2010)用の
    VSTOアドインのアプリケーションを開発しています。
    接続先はOffice365です。フレームワークは .NET Framework 4.5.2です。

    c#は始めたばかりの初心者です。Visual Studioやc#の言葉の使い方には
    自信がありません。もし間違えていればご指摘いただくと幸いです。

    [背景]
    メールを作成,返信,転送した時のメール編集画面で送信元を
    変更したときに、編集画面の本文などを修正しようとしています。

    以下のソースでは、送信元などが変更されたときの
    イベントハンドラ(mailItem_PropertyChange)で、
    Inspectors_NewInspectorが持っているmailItemを参照することができないため、
    編集画面の本文などを変更することができません。

    ThisAddInクラス内でprivate staticなmailItemを定義して、
    mailItem_PropertyChangeで参照しましたが、2つ目のメール編集画面では、
    正しく動作しません(当たり前ですよね・・・)。

    [質問事項]
    イベントハンドラ(mailItem_PropertyChange)でmailItemを参照(ref)するには、
    どのようにすればよいのでしょうか。

    よろしくお願いいたします。

    namespace ToolOutlook2010P1
    {
        Outlook.Inspectors inspectors;
    
        public partial class ThisAddIn
        {
            Outlook.Inspectors inspectors;
            private void ThisAddIn_Startup(object sender, System.EventArgs e)
            {
                inspectors = Application.Inspectors;
                inspectors.NewInspector += new Outlook.InspectorsEvents_NewInspectorEventHandler(Inspectors_NewInspector);
            }
        }
        
        private void Inspectors_NewInspector(Outlook.Inspector Inspector)
        {
            mailItem = Inspector.CurrentItem as Outlook.MailItem;
            if (mailItem != null)
            {
                if (mailItem.EntryID == null)
                {
                    mailItem.PropertyChange += mailItem_PropertyChange;
                }
            }
        }
    
        private static void mailItem_PropertyChange(string name)
        {
            if (name == "SentOnBehalfOfName")
            {
                // ここで、Inspectors_NewInspectorのmailItemを
                // 参照したい
            }
        }
    }


    2017年4月14日 2:26

回答

  • 単純には、ラムダ式を使ってキャプチャしちゃうとか。

    private void Inspectors_NewInspector(Outlook.Inspector Inspector)
    {
        mailItem = Inspector.CurrentItem as Outlook.MailItem;
        if (mailItem != null)
        {
            if (mailItem.EntryID == null)
            {
                mailItem.PropertyChange += (_name) =>
                {
                    if (_name == "SentOnBehalfOfName")
                    {
                        this.OnSentOnBehalfOfNameChanged(mailItem);
                    }
                };
            }
        }
    }
    
    private void OnSentOnBehalfOfNameChanged(Outlook.MailItem mailItem)
    {
    }
    • 回答としてマーク よーすけ 2017年4月14日 5:20
    2017年4月14日 2:51

すべての返信

  • 単純には、ラムダ式を使ってキャプチャしちゃうとか。

    private void Inspectors_NewInspector(Outlook.Inspector Inspector)
    {
        mailItem = Inspector.CurrentItem as Outlook.MailItem;
        if (mailItem != null)
        {
            if (mailItem.EntryID == null)
            {
                mailItem.PropertyChange += (_name) =>
                {
                    if (_name == "SentOnBehalfOfName")
                    {
                        this.OnSentOnBehalfOfNameChanged(mailItem);
                    }
                };
            }
        }
    }
    
    private void OnSentOnBehalfOfNameChanged(Outlook.MailItem mailItem)
    {
    }
    • 回答としてマーク よーすけ 2017年4月14日 5:20
    2017年4月14日 2:51
  • Hongliangさん

    迅速なご回答をいただきまして、ありがとうございます。

    OnSentOnBehalfOfNameChangedメソッドで、Inspectors_NewInspectorの
    mailItemを参照することができました!!
    ※複数のメール編集画面で正常動作しました。
    悩んでいたので、期待通りに動作して気持ちが楽になりました。

    「ラムダ式を使ってキャプチャ」という部分は現時点では理解できませんでしたが、
    調べていきたいと思います。

    Hongliangさんから頂きましたご返信を「回答としてマーク」させていただきました。

    [補足]
    今回は参照したかったので、引数にはrefキーワードをつけています。
    OnSentOnBehalfOfNameChanged(ref mailItem);

    2017年4月14日 5:24