无法从Outlook 2010中的通讯簿中删除联系人

时间:2013-01-16 18:47:09

标签: c# vsto outlook-addin outlook-2010

我可以在地址簿中添加联系人但由于某种原因我无法将其删除。我执行的代码如下。

String abName = "Name ofthe targetted address book";
Outlook.Folder addressBook;
if (targetFolder.Folders.OfType<Outlook.Folder>().Any(element
  => element.Name == abName))
  addressBook = targetFolder.Folders[abName] as Outlook.Folder;
else
  addressBook = targetFolder.Folders.Add(
    abName, Outlook.OlDefaultFolders.olFolderContacts) as Outlook.Folder;
addressBook.ShowAsOutlookAB = true;

for (int i = addressBook.Items.Count - 1; i >= 0; i--)
  if (!stringList.Any(element 
    => element == addressBook.Items.OfType<Outlook.ContactItem>()
      .ToList()[i].Email1Address))
    addressBook.Items.OfType<Outlook.ContactItem>().ToList().RemoveAt(i);

提取地址簿的工作原理以及字符串的匹配也是如此。我进入 RemoveAt 行以获得完全正确的联系人。执行删除时没有错误或其他消息。不过,联系人列表仍然不受影响。

  1. 为什么?
  2. 如何才能真正删除联系人?
  3. 我怀疑我可能正在处理包含联系人的实际列表的副本。问题是,如果我不创建列表,我不确定如何更改联系人列表。

    因此,最有用的答案将阐明如何在某些条件下改变addressBook(或许addressBook.Items)。例如,假设我们要删除所有名称以#34; Q&#34;开头的名字开头。

    此刻,我只能想到一个超级丑陋的工作,而且它如此直观 - 丑陋,我甚至不在这里提及它。真的很丑......

2 个答案:

答案 0 :(得分:1)

您不能删除Outlook联系人。您正在从自己的List对象中删除OUtlook对象。

您需要致电ContactItem.Delete

作为旁注,在使用COM对象时不要使用多点符号,尤其是在循环中 - 每个点都会收到一个全新的COM对象。

答案 1 :(得分:1)

这是一个解决方案

    private void ClearContact(Outlook.Application outlookApplication)
    {
        Outlook.MAPIFolder contactFolder = outlookApplication.Session.GetDefaultFolder(OlDefaultFolders.olFolderContacts);
        int total = contactFolder.Items.Count;
        while (total > 0)
        {
            // first index number is 1 not 0
            var contact = (Outlook.ContactItem)contactFolder.Items[1];
            contact.Delete();
            total = contactFolder.Items.Count;
        }
    }

我使用netoffice outlook api http://netoffice.codeplex.com/wikipage?title=Outlook_Example05 并使用while循环删除所有联系人