如何删除outlook非默认日历中的日历会议

问题描述 投票:0回答:1

我正在尝试删除 Outlook 中的约会,我使用了我在该主题下找到的代码使用 GlobalAppointmentID 获取 Outlook AppointmentItem。简而言之,代码将自定义属性添加到约会的 UserProperties 集合中,并将 GlobalAppointmentID 作为文本存储在新属性中,稍后搜索该属性/值组合并对约会执行您需要的操作。当约会位于 Outlook 默认日历上时,该代码运行良好,但当约会位于用户创建的日历上时,我找不到该约会。

我收到以下错误:

这是查找和删除约会的伪代码:

MAPIFolder calendarFolder = GetCalendar(userCalendar); //find user created calendar

string filter = String.Format("[GAID] = '{0}'", globalAppointmentID); 
Items calendarItems = calendarFolder.Items;
calendarItems.IncludeRecurrences = true;

try
{
    Outlook.AppointmentItem appointmentItem = null;
    appointmentItem = calendarItems.Find(filter);

    if (appointmentItem != null)
    {
        appointmentItem.Delete();
    }
}
catch (System.Exception ex)
{
   throw;
}

我知道该属性在那里,因为我能够循环遍历 userProperties 集合并查看其名称和值

 foreach (AppointmentItem item in calendarItems)
   {
       for (int i = 1; i <= item.UserProperties.Count; i++)
       {
           Console.WriteLine(item.UserProperties[i].Name);
           Console.WriteLine(item.UserProperties[i].Value);
       }
   }

这似乎对我有用,但事实并非如此,我错过了什么?

谢谢你

c# outlook interop
1个回答
0
投票

仅当您的属性添加到文件夹字段时,Outlook 才会通过名称 (

GAID
) 识别您的属性。如果您使用
UserProperties.Add
参数 == true 调用
AddToFolderFields
,就会出现这种情况。

如果约会被移至其他文件夹,Outlook 将不知道该属性名称的含义。您可以使用 DASL 属性名称和

"@SQL="
查询前缀来解决该问题。要找出任何 MAPI 属性的 DASL 名称,请使用 OutlookSpy 查看它(我是其作者) - 选择具有问题集中属性的约会,单击 OutlookSpy 功能区上的 IMessage 按钮,选择属性,查看在“DASL”编辑框中。如果使用
UserProperties.Add
添加属性,DASL 名称将为
"http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/GAID/0x0000001F"

string filter = String.Format("@SQL=""http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/GAID/0x0000001F"" = '{0}'", globalAppointmentID); 

请注意,您需要设置自定义用户属性的唯一原因是 Outlook 对象模型不允许搜索二进制 (

PT_BINARY
) MAPI 属性,例如
GlobalAppointmentID
。如果可以选择使用Redemption(我也是它的作者),您可以使用如下代码:

RDOSession session = new Redemption.RDOSession;
session.MAPIOBJECT = Application.Session.MAPIOBJECT;
RDOFolder folder = session.GetFolderFromID(calendarFolder.EntryID);
string filter = string.Format("GlobalAppointmentID = '{0}'", globalAppointmentID);
RDOAppointmentItem appointmentItem  = folder.Items.Find(filter);
if (appointmentItem != null)
{
   appointmentItem .Delete();
}
© www.soinside.com 2019 - 2024. All rights reserved.