Iterating a Contacts folder for Outlook 2003 and 2007 in C#

  • Thread starter Thread starter Marketware
  • Start date Start date
M

Marketware

I need to iterate through all of the contacts in a contact folder. I have
tried two methods to get the contacts out of a Contact folder: Here is the
first code I've tried:

Outlook.Application Outlook = new Outlook.Application();
Outlook.MAPIFolder fldContacts =
(Outlook.MAPIFolder)Outlook.Session.GetDefaultFolder(OlDefaultFolders.olFolderContacts);

foreach (Outlook.ContactItem oItem1 in fldContacts.Items)
{//Get each contact...}

I get the following complile error when I attempt the above:

foreach statement cannot operate on variables of type 'Outlook.Items'
because 'Outlook.Items' does not contain a public definition for
'GetEnumerator'
Then I tried this approach:

Outlook.ContactItem oItem;

for (int j = 0; j < oContactFolder.Items.Count; j++)
{
if (j == 0)
oItem = (Outlook.ContactItem)oContactFolder.Items.GetFirst();
else
oItem = (Outlook.ContactItem)oContactFolder.Items.GetNext();

But with the above approach I'm getting the first contact, and a second, but
from that point on it keeps returning the same second record (out of 20
total).

Can anyone help me see what I am doing wrong here? It really shouldn't be
that difficult to accomplish what I am trying to do here.

Thanks!!!!!!!!!

bob
 
A contacts folder can have distribution lists in it, any code that doesn't
handle that possibility will fail in some cases. Also, Outlook collections
are 1 based and don't start at 0. You also should not concatenate dot
operators, that creates invisible object variables you cannot release,
always declare everything explicitly.

Outlook.Items items = oContactFolder.Items;

Outlook.ContactItem c = null;

if (items.Count > 0)
{
for (int i = 1; i <= items.Count; i++)
{
try
{
c = (Outlook.ContactItem)items; // if DL will error to catch
block
}

etc.
 
Now I have a new compiler problem. On the line:

c = (Outlook.ContactItem)items;

I get the following:

Cannot apply indexing with [] to an expression of type 'Outlook.Items'

I've also tried to replace with () and I get another error about trying to
use as a method.

Ideas??


Ken Slovak - said:
A contacts folder can have distribution lists in it, any code that doesn't
handle that possibility will fail in some cases. Also, Outlook collections
are 1 based and don't start at 0. You also should not concatenate dot
operators, that creates invisible object variables you cannot release,
always declare everything explicitly.

Outlook.Items items = oContactFolder.Items;

Outlook.ContactItem c = null;

if (items.Count > 0)
{
for (int i = 1; i <= items.Count; i++)
{
try
{
c = (Outlook.ContactItem)items; // if DL will error to catch
block
}

etc.




Marketware said:
I need to iterate through all of the contacts in a contact folder. I have
tried two methods to get the contacts out of a Contact folder: Here is
the
first code I've tried:

Outlook.Application Outlook = new Outlook.Application();
Outlook.MAPIFolder fldContacts =
(Outlook.MAPIFolder)Outlook.Session.GetDefaultFolder(OlDefaultFolders.olFolderContacts);

foreach (Outlook.ContactItem oItem1 in fldContacts.Items)
{//Get each contact...}

I get the following complile error when I attempt the above:

foreach statement cannot operate on variables of type 'Outlook.Items'
because 'Outlook.Items' does not contain a public definition for
'GetEnumerator'
Then I tried this approach:

Outlook.ContactItem oItem;

for (int j = 0; j < oContactFolder.Items.Count; j++)
{
if (j == 0)
oItem = (Outlook.ContactItem)oContactFolder.Items.GetFirst();
else
oItem = (Outlook.ContactItem)oContactFolder.Items.GetNext();

But with the above approach I'm getting the first contact, and a second,
but
from that point on it keeps returning the same second record (out of 20
total).

Can anyone help me see what I am doing wrong here? It really shouldn't be
that difficult to accomplish what I am trying to do here.

Thanks!!!!!!!!!

bob

.
 
No idea, that is very bizarre.

I use that type of code all the time. It compiles perfectly here. In fact, I
copied it from a working project I was just compiling.

I just tested and compiled again, and it compiled again with no errors.
There's some other problem that you have.
 
I am using the code you wrote to instaniate an Outlook object. I'm going to
create a new project (separate out just this code) into a new project and see
if I can see anything.

bob

Ken Slovak - said:
No idea, that is very bizarre.

I use that type of code all the time. It compiles perfectly here. In fact, I
copied it from a working project I was just compiling.

I just tested and compiled again, and it compiled again with no errors.
There's some other problem that you have.




Marketware said:
Now I have a new compiler problem. On the line:

c = (Outlook.ContactItem)items;

I get the following:

Cannot apply indexing with [] to an expression of type 'Outlook.Items'

I've also tried to replace with () and I get another error about trying to
use as a method.

Ideas??


.
 
A thought occurred to me. Is this with a PIA from Add-In Express? That might
have a limitation of some sort on the enumerator of an Items collection or
using an indexed operator. The standard PIA's certainly don't have that
limitation, I use Items collections all the time in c# code.

In just looking at an Add-In Express PIA for Outlook I see that it's
exposing an Item object that takes an index value, so that looks like the
problem. Something like items.Item(i) looks like it would work.
 
It appears as if I've got some weird "Using Statements" One that's just

Using Outlook;

and other,

Using Outlook1 = Microsoft.Office.Interop.Outlook;

And the original DLL on the above did not allow the "foreach". I found
another DLL which does allow it, and it seemed to work with both 2003 and
2007 so I think I may be OK with that. But do you know what the first one is
pointing to? If I remove it I get a bunch of errors in the stuff you wrote
for us.


Marketware said:
I am using the code you wrote to instaniate an Outlook object. I'm going to
create a new project (separate out just this code) into a new project and see
if I can see anything.

bob

Ken Slovak - said:
No idea, that is very bizarre.

I use that type of code all the time. It compiles perfectly here. In fact, I
copied it from a working project I was just compiling.

I just tested and compiled again, and it compiled again with no errors.
There's some other problem that you have.




Marketware said:
Now I have a new compiler problem. On the line:

c = (Outlook.ContactItem)items;

I get the following:

Cannot apply indexing with [] to an expression of type 'Outlook.Items'

I've also tried to replace with () and I get another error about trying to
use as a method.

Ideas??


.
 
Hi Bob,
Using Outlook;

Add-in Express provides version-neutral interops. In your case the interops
are for Outlook 2000 and Office 2000 (common tools). The namespaces
contained in these interops are Outlook and Office, respectively.
Using Outlook1 = Microsoft.Office.Interop.Outlook;

This statement refers to PIA for some Outlook version; it may be Outlook
2002, 2003 or 2007.
c = (Outlook.ContactItem)items;


Yes, this is a kind of restriction in version-neutral interops. Try c =
items.Item(i) as Outlook.ContactItem;

Also, you may want to read my post at the Add-in Express blog on how to
support several Outlook versions in a COM add-in using different interop
versions via early and late binding, see
http://www.add-in-express.com/creating-addins-blog/2010/03/16/interop-assemblies-late-binding/.

I am a rare visitor here. If you have any questions you can quickly reach me
on our forums, see http://www.add-in-express.com/forum/index.php.

Regards from Belarus (GMT+2),

Andrei Smolin
Add-in Express Team Leader
www.add-in-express.com


Marketware said:
It appears as if I've got some weird "Using Statements" One that's just

Using Outlook;

and other,

Using Outlook1 = Microsoft.Office.Interop.Outlook;

And the original DLL on the above did not allow the "foreach". I found
another DLL which does allow it, and it seemed to work with both 2003 and
2007 so I think I may be OK with that. But do you know what the first one
is
pointing to? If I remove it I get a bunch of errors in the stuff you
wrote
for us.


Marketware said:
I am using the code you wrote to instaniate an Outlook object. I'm going
to
create a new project (separate out just this code) into a new project and
see
if I can see anything.

bob

Ken Slovak - said:
No idea, that is very bizarre.

I use that type of code all the time. It compiles perfectly here. In
fact, I
copied it from a working project I was just compiling.

I just tested and compiled again, and it compiled again with no errors.
There's some other problem that you have.




Now I have a new compiler problem. On the line:

c = (Outlook.ContactItem)items;

I get the following:

Cannot apply indexing with [] to an expression of type
'Outlook.Items'

I've also tried to replace with () and I get another error about
trying to
use as a method.

Ideas??

.
 
In addition to what Andrei said if you updated your Add-In Express at any
point there might be references pointing to different paths or file names
that might need to be adjusted for a different version. For example in
loading a project created with an earlier version in the latest version of
Add-In Express I always have to adjust some references.




Andrei Smolin said:
Hi Bob,
Using Outlook;

Add-in Express provides version-neutral interops. In your case the
interops are for Outlook 2000 and Office 2000 (common tools). The
namespaces contained in these interops are Outlook and Office,
respectively.
Using Outlook1 = Microsoft.Office.Interop.Outlook;

This statement refers to PIA for some Outlook version; it may be Outlook
2002, 2003 or 2007.
c = (Outlook.ContactItem)items;


Yes, this is a kind of restriction in version-neutral interops. Try c =
items.Item(i) as Outlook.ContactItem;

Also, you may want to read my post at the Add-in Express blog on how to
support several Outlook versions in a COM add-in using different interop
versions via early and late binding, see
http://www.add-in-express.com/creating-addins-blog/2010/03/16/interop-assemblies-late-binding/.

I am a rare visitor here. If you have any questions you can quickly reach
me on our forums, see http://www.add-in-express.com/forum/index.php.

Regards from Belarus (GMT+2),

Andrei Smolin
Add-in Express Team Leader
www.add-in-express.com
 
Back
Top