【发布时间】:2016-03-09 19:38:55
【问题描述】:
我们有一组公司维护的公共联系人,但用户只处理其中的一部分,因此他们在本地列表中拥有这些联系人的副本。这些已经过时了。我想从公共联系人中覆盖本地联系人的信息,但除了创建 ContactItem 然后手动将每个属性设置为来自公众的值之外,找不到更简单的方法。有没有更简单的方法可以将现有联系人添加到本地列表中?
我现在在做什么
// Get the public folder for the contacts
session = Application.GetNamespace("MAPI"); // Application is Outlook
sessionFolders = session.Foldeers;
publicFolders = sessionFolders["Public Folders"];
publicContacts = publicFolders["Public Contacts"];
publicContactsItems = publicContacts.Items;
localContacts = session.GetDefaultFolder(Outlook.OlDefaultFoldes.olFolderContacts);
localContactItems = localContacts.Items;
for(int p = 1; p <= publicContactItems.Count; p++)
{
var pContact = publicContactItems[p];
// Search for the contact in the users local list
for(int l = 1; p <= localContactItems.Count; l++)
{
var lContact = localContactItems[l];
if(publicContact.Email1Address == localContact.Email1Address)
{
// Copy information.
// DOING localContacts.Items.Add(publicContact) DOES NOT WORK!
// lContact = pContact doesn't work either.
// lContact.FirstName = pContact.FirstName; lContact.Save(); does
}
}
}
我不确定“复制信息”部分的最佳选择。我可以删除当前联系人并使用Application.CreateItem(OlItemType.olContactItem) 创建一个新联系人,或者我可以使用当前项目,覆盖属性并保存。不过,无论哪种方式都有很多属性。
编辑:我可能没有添加足够的信息。 ContactItem 是 Outlook 类,而不是我创建的对象。所有这些代码都在 Outlook 加载项中。我添加了更多代码来显示这一点。
EDIT NUMERO DOS:使用@ext0 答案和另一个问题作为参考,我能够解决它。
对@ext0 答案的轻微修改
if (lContact.Email1Address == pContact.Email1Address)
{
var lProperties = lContact.ItemProperties
var pProperties = pContact.ItemProperties
for (i = 0; i < pProperties.Count; i++) // ItemProperties goes back 0 index, keep it up Microsoft!
{
try { lProperties[i].Value = pProperties[i].Value}
catch{} // Even though Value is read/write, some properties are read-only
}
lContact.Save();
}
记住孩子们!使用后始终释放您的 com 对象!
【问题讨论】:
-
首先,你为什么从索引 1 开始? C# 中的可枚举集从 0 开始。另外,当您尝试运行
localContacts.Items.Add(publicContact)时会抛出什么异常确切? -
来自
Items对象The index for the Items collection starts at 1, and the items in the Items collection object are not guaranteed to be in any particular order.的 MSDN 页面,异常没有给我异常类型,但消息是“抱歉,出了点问题。您可能想试试 agian。” -
我很抱歉。是否可以就地修改对象?
-
没问题!我不确定您所说的“修改”是什么意思。像
localContact = publicContact或localContact.FirstName = publicContact.FirstName这样的东西。第一个不起作用,第二个起作用。 -
好的,那么我建议我在下面列出的解决方案可能对您有用。 :)
标签: c# outlook-addin