【问题标题】:Can't remove contacts from an address book in Outlook 2010无法从 Outlook 2010 中的通讯簿中删除联系人
【发布时间】:2017-07-05 15:38:21
【问题描述】:

我可以将联系人添加到通讯簿,但由于某种原因我无法将其删除。我正在执行的代码如下。

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. 如何才能真正删除联系人?

我怀疑我可能正在处理包含联系人的实际列表的副本。问题是如果我不创建 List,我不确定如何更改联系人列表。

因此,最有帮助的答案将阐明如何在特定条件下更改 addressBook(或者可能是 addressBook.Items)。例如,假设我们要删除所有姓名以字母“Q”开头的联系人。

此时我只能想到一个超级丑陋的解决方法,而且它是如此丑陋,以至于我什至不在这里提及它。真丑……

【问题讨论】:

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


    【解决方案1】:

    您没有删除 Outlook 联系人。您正在从您自己的 List 对象中删除一个 OUTlook 对象。

    您需要致电ContactItem.Delete

    附带说明,在处理 COM 对象时不要使用多个点表示法,尤其是在循环中 - 每个点都会收到一个全新的 COM 对象。

    【讨论】:

    • 几个月前我遇到了类似的问题,但并没有以一种很好的方式解决问题。我记得删除通讯簿的成员只会将它们移动到另一个文件夹(我认为已删除)。有没有更好的方法来删除 Outlook 中的内容?如-remove-remove?
    • 然后您可以在“已删除邮件”文件夹中打开该项目(找到正确的可能很棘手)并再次删除它。或者您可以使用 Redemption - 它的 RDOMail.Delete 方法采用一个枚举,可让您指定必须如何删除邮件:移动到已删除邮件文件夹、删除或硬删除(特定于 Exchange - 该项目将不可恢复)。
    • 你确定吗?我记得从 Deleted Items 中的删除不起作用。 Redemption - 它是 .NET 中的一个类吗?一些客户对安装第三方产品很敏感...
    • 是的,尝试一个实验 - 确保 Deleted Items 文件夹为空,调用 ContactItem.Delete(它将被移动到 Deleted Items 文件夹),然后调用 Application.Session.GetDefaultFolder(olFolderDeletedItems).Items .Item(1).删除。当然,如果“已删除邮件”文件夹中有多个项目,情况会更加复杂。 Redemption 是一个非托管 COM 库,可以任何语言访问,包括任何 .Net 语言 - dimastr.com/redemption
    【解决方案2】:

    这是一个解决方案

        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循环删除所有联系人

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多