3

Item_Send で Cancel を true に設定すると、会議ウィンドウが閉じてしまうため、会議出席依頼の Item_Write イベント ハンドラーで Cancel チェックを設定しています。私がやろうとしているのは、通常はリボンのカスタム ボタンを使用して処理される受信者がいることをユーザーに促すことです (私の質問ではボタンの詳細は重要ではありません)。とにかく、Item_Write イベントをキャンセルしようとすると、関係なく会議通知が送信されます。何を試しても、ref Cancel を true に設定しているにもかかわらず、会議通知の送信を止めることはできません。Item_Send でキャンセルすると、ウィンドウが閉じますが、これはユーザーが望んでいるものではありません。この時点で思いつくのは、おそらく requestDetailsRegion.SaveRequestDetailsToLocalOutlookItemProperties() だけです。これは、カスタム フォーム領域フィールド プロパティを AppointmentItem の定義済みカスタム プロパティに保存し、Application_Item_Load イベントをトリガーします。これにより、保留中のように Outlook に会議招待通知を送信するように促されます。これを Outlook 2010 で実行しています。よろしくお願いします。

コード例を次に示します。

  void Item_Write(ref bool Cancel)        
 {    

            Cancel = CancelInvite(Cancel);                
 }

        private bool CancelInvite(bool Cancel)
        {

            Inspector activeInspector = Globals.ThisAddIn.Application.ActiveInspector();
            WindowFormRegionCollection formRegions = Globals.FormRegions[activeInspector];
            RequestDetailsFormRegion requestDetailsRegion = formRegions.RequestDetailsForm;


                // Add request form details to meeting item.
                requestDetailsRegion.SaveRequestDetailsToLocalOutlookItemProperties();

                // Checking if there's an incomplete form request pending submission
                if (requestDetailsRegion.txtFileName_Hidden.TextLength == 0 &&
                    appointmentItem != null && appointmentItem.MeetingStatus != OlMeetingStatus.olMeetingCanceled)
                {
                    Persons meetingRecipients = new Persons();



                    foreach (Outlook.Recipient recipient in appointmentItem.Recipients)
                        if (recipient.Address != activeInspector.Session.CurrentUser.Address)
                            meetingRecipients.Add(new MeetingRecipient(recipient));

                    if (meetingRecipients.ContainsSpecialRecipients)
                    {                           
                        CustomDialog customDialog = new CustomDialog();
                        customDialog.OkButtonText = messageBoxTextStatusOK;
                        customDialog.CancelButtonText = messageBoxTextStatusCancel;

                        DialogResult dialogResult = customDialog.ShowDialog();

                        if (dialogResult == DialogResult.Cancel)
                        {
                            Cancel = true;
                        }
                        else
                        {
                            Cancel = false;
                        }    

                        customDialog.Close();
                    }
                }                

            return Cancel;
        }

   public void SaveRequestDetailsToLocalOutlookItemProperties()
        {
            if (this.OutlookItem is Outlook.AppointmentItem)
            {
                Outlook.AppointmentItem appointmentItem = (Outlook.AppointmentItem)this.OutlookItem;

                // Checking if organizer already cancelled meeting. If so, then no need to update apppointment item properties.
                if (appointmentItem.MeetingStatus != Outlook.OlMeetingStatus.olMeetingCanceled)
                {

                    appointmentItem.ItemProperties[RequestSubmitted].Value = chkSubmitted.Checked; // Hidden 
                    appointmentItem.ItemProperties[Filename].Value = txtFileName_Hidden.Text; // Hidden

                    appointmentItem.ItemProperties[ReasonForVisit].Value = txtReason.Text;

   // SPARING SIMILAR LINES OF CODE

    ...
                    chkSaved.Checked = true;
                }
            }
4

1 に答える 1

1

(ref) Cancel パラメータを true に設定しない

void Item_Write(ref bool Cancel)        
 {    

            this.cancelInviteResult = CancelInvite(Cancel);
            Cancel = this.cancelInviteResult; 
 }
于 2013-04-10T18:23:00.350 に答える