2016-05-27 18 views
1

私はMicrosoft.Office.Interop.Outlookを使用して、予定をインターフェイスに読み込んで予定を編集しています。予定を完全に読み込めます。編集は機能しますが、100%はできません。場合によってはエラーが発生するThe operation cannot be performed because the message has been changedプログラムで予定を編集する

The operation cannot be performed because the message has been changedのエラーを回避するために、予定を編集する方が良い方法があるのでしょうか。まずSave()

public Outlook.AppointmentItem EditOutlookAppointment(CustomAppointment appointment, int retries = 0) 
{ 
    Outlook.AppointmentItem appointReturned = null; 
    try 
    { 
     Outlook.Application outlookApp = new Outlook.Application(); 
     MAPIFolder calendarFolder = outlookApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar); 

     for (int i = calendarFolder.Items.Count; i > 0; i--) 
     { 
      var appointmentItem = ((Outlook.AppointmentItem)calendarFolder.Items[i]); 

      if (appointmentItem.GlobalAppointmentID == appointment.UniqueId) 
      { 
       // set some properties 
       appointmentItem.Subject = appointment.Subject; 
       appointmentItem.Body  = appointment.Body; 
       appointmentItem.Location = appointment.Location;   //Set the location 
       appointmentItem.Start = appointment.Start; 
       appointmentItem.End = appointment.End; 
       appointmentItem.Save(); 
       return appointmentItem; 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
      //Error message implementation here 
    } 
    return appointReturned; 
} 
+0

どのような行にエラーメッセージが表示されますか? –

+0

Updated @Sylverac – Master

答えて

1

しようとしたときにエラーが発生し、そのようなエラーは避けられない - それは予定がOutlookがそれを開いた時、あなたは保存と呼ばれる時間の間に変更されたことを意味します。そして、Outlookは実際に予定をキャッシュするのが好きなので(Outlookまたは編集済み予定の予定を常にキャッシュします)、その期間はかなり長くなる可能性があります。これは、予定がExchangeサーバー自体によって変更された場合、または受信会議の更新処理によって変更された場合に発生します。

第2に、予定表フォルダー内のすべてのアイテムをループすることは、大きなパフォーマンス上の問題となります。残念ながら、Outlookでは、GlobalAppointmentIDなどのバイナリ(PT_BINARY)プロパティで検索することはできません(Items.Find/FindNextItems.Restrict)。これには拡張MAPI(C++またはDelphi)またはRedemption(任意の言語)を使用する必要があります(バイナリプロパティの検索を許可するにはRDOtems.Find/FindNext/Restrict)。

更新。以下は、私の頭の上から償還を使用して動作するはずです:

publicRedemption.RDOAppointmentItem EditOutlookAppointment(CustomAppointment appointment, int retries = 0) 
{ 
    try 
    { 
     Outlook.Application outlookApp = new Outlook.Application(); 
     Redemption.RDOSession session = new Redemption.RDOSession(); 
     session.MAPIOBJECT = outlookApp.Session.MAPIOBJECT; //share the Outlook session 
     RDOFolder calendarFolder = session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar); 
     Redemption.RDOAppointmentItem appointmentItem = calendarFolder.Items.Find("GlobalAppointmentID = '"+appointment.UniqueId + "'"); 

     if (appointmentItem != null) 
     { 
       // set some properties 
       appointmentItem.Subject = appointment.Subject; 
       appointmentItem.Body  = appointment.Body; 
       appointmentItem.Location = appointment.Location;   //Set the location 
       appointmentItem.Start = appointment.Start; 
       appointmentItem.End = appointment.End; 
       appointmentItem.Save(); 
       return appointmentItem; 
     } 
    } 
    catch (Exception ex) 
    { 
      //Error message implementation here 
    } 
    return null; 
} 
+0

こんにちは@ドミトリー、anychanceであなたはチュートリアルやヘルプを持っていますか、C#での特典交換を利用していますか? – Master

+0

[こちら](http://www.dimastr.com/redemption/rdo_introduction.htm)をご覧ください。サンプルはC#ではありませんが、翻訳は非常に簡単です。また、使用していないCOMオブジェクトをリリースすることを忘れないでください。 –

+0

上記の更新された回答を参照 –

関連する問題