Announcement

Collapse
No announcement yet.

VS2010 Outlook-AddIn

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • VS2010 Outlook-AddIn

    Hallo Zusammen,

    ich muss eine OutlookAddIn-Schnittstelle erweitern.

    Leider komme ich hier nicht weiter.

    Ich habe schon Probleme mit den Foldern. Im Internet habe ich auch (für mich) nichts gefunden, dass mir folgenden Code erklären könnte, bzw ob dieser Code überhaupt so funktioniert.

    Vorgabe ist, dass sämtliche Kontaktordner aus dem Outlook erkannt werden und ich Sie dann in einer Schleife (Klasse) auslesen und bearbeiten kann.

    Hier der Code für das Finden von Kontakten (war schon da).

    [highlight=c#]
    private void btnLookup_Click(object sender, EventArgs e)
    {
    var frmLookup = new FormContactsFinder(ThisAddIn.MyContactFolder as Folder, txtAP.Text);
    if(DialogResult.OK != frmLookup.ShowDialog(this) ) return;
    if(frmLookup.Person!=null)
    {
    txtAP.Text = frmLookup.Person.Name + " (" + frmLookup.Person.SAPID + ")";
    }
    }

    [/highlight]

    FormContactsFinder ist ein Konstruktor für die Form.

    Wenn ich in der Überwachung die Variable frmLookup betrachte, dann erkenne ich nur eine Kontaktgruppe.

    Was muss hier anders Programmiert sein, damit ich sämtliche Kontaktordner bereitstelle?

    Gruß Lerando

  • #2
    Der Code sieht mir eher aus als würde er, unter Berücksichtigung von txtAP, die entsprechenden Daten des Ansprechpartners ausgeben, aber nicht die Kontaktliste. Das sollte aus meinem Verständniss heraus eher über eine Collection laufen und eine foreach() die das dann Satz für Satz verarbeitet. Wobei ich nicht weiß ob dann nur Items oder evtl. auch noch mal Folder ankommen die dann wiederum durchlaufen werden müssten, aber ich habe in meinen Kontakten auch Gruppe und ich wäre überrascht wenn die automatisch aufgelöst würden.

    Gruß Womble

    Comment


    • #3
      Danke Womble.

      Allerdings habe ich nun ein neues Problem.

      Ich habe versucht das Beispiel von MS zu integrieren Das Objekt Folders
      [highlight=c#]
      // TODO: Add code here to start the application.
      Outlook._Application olApp = new Outlook.ApplicationClass();
      Outlook._NameSpace olNS = olApp.GetNamespace("MAPI");Outlook._Folders oFolders;
      oFolders = olNS.Folders;
      Outlook.MAPIFolder oPublicFolder = oFolders.Item("Public Folders");
      oFolders = oPublicFolder.Folders;
      Outlook.MAPIFolder oAllPFolder = oFolders.Item("All Public Folders");
      oFolders = oAllPFolder.Folders;
      Outlook.MAPIFolder oMyFolder = oFolders.Item("My Public Folder");
      Console.Write(oMyFolder.Name);
      [/highlight]

      Allerdings bekomme ich einen Fehler während des Implementierens mit oFolders.Item. D. h. .Item wird gar nicht angeboten.

      Wie kann ich nun das Beispiel in meine Praxis umsetzen?

      Gruß Lerando
      Zuletzt editiert von Lerando; 19.11.2012, 15:49.

      Comment


      • #4
        [HIGHLIGHT='C#']
        Outlook._Application olApp = new Outlook.ApplicationClass();
        Outlook._NameSpace olNS = olApp.GetNamespace("MAPI");
        Outlook._Folders oFolders = olNS.Folders;
        foreach (Outlook.MAPIFolder oFolder in oFolders)
        {
        lstResults.Items.Add(oFolder.Name);
        }
        [/HIGHLIGHT]

        Mit dem Code bekommst Du einen Ordner nach dem andern die Du dann innerhalb der Schleife über oFolder ansprechen kannst, die Ordner können dann wiederum Ordner enthalten und eben auch Items.

        Ein direktes ansprechen per .Item geht bei mir auch nicht.

        Gruß Womble

        Comment


        • #5
          Nach langem bin ich der Lösung einen Schritt näher aber noch nicht fertig.

          Mit dem Code
          [highlight=c#]
          internal Outlook.MAPIFolder GetDefaultContactFolder()
          {
          Outlook.MAPIFolder contactsFolder = this.Application.Session.GetDefaultFolder( Outlook.OlDefaultFolders.olFolderContacts ) as Outlook.Folder;
          Outlook.AddressLists addrLists = this.Application.Session.AddressLists;

          int counter = 0;


          foreach (Outlook.AddressList addrList in addrLists)
          {
          Outlook.Folder testFolder = addrList.GetContactsFolder() as Outlook.Folder;

          if (testFolder != null)
          {
          System.Diagnostics.Debug.WriteLine( string.Format( "AdressBookName: {0} -- Name: {1}",
          testFolder.AddressBookName, testFolder.Name ) );

          // Test to determine if Folder returned
          // by GetContactsFolder has same EntryID
          // as default Contacts folder.
          if (Application.Session.CompareEntryIDs(contactsFolde r.EntryID, testFolder.EntryID ))
          {
          Outlook.SelectNamesDialog snd =
          Application.
          Session.GetSelectNamesDialog();
          snd.InitialAddressList = addrList;
          snd.Display();
          }
          }
          }


          Outlook.Items searchFolder = contactsFolder.Items;
          string findLastName = "Test";
          foreach (Outlook.ContactItem foundContact in searchFolder)
          {

          if (foundContact.LastName != null)
          {
          Debug.WriteLine(foundContact.FullName);

          if (foundContact.LastName.Contains(findLastName))
          {
          foundContact.Display(false);
          counter = counter + 1;
          }
          }
          }
          MessageBox.Show(string.Format("You have {0} contacts with last names that contain {1}.", counter, findLastName));


          //Outlook.NameSpace outlookNameSpace = Application.GetNamespace("MAPI");
          //Outlook.MAPIFolder contactsFolder = outlookNameSpace.GetDefaultFolder(Outlook.OlDefaul tFolders.olFolderContacts);

          return contactsFolder;
          }
          [/highlight]

          Bekomme ich Zugriff auf die Adresslisten. Nun habe ich die Schwierigkeit, wenn ich dasselbe in einer anderen Klasse durchführen möchte, kann ich z. B. Outlook.Folder testFolder = addrList.GetContactsFolder() as Outlook.Folder; nicht mehr ausführen GetContactsFolder() wird nicht mehr angeboten.

          Im Internet habe ich nichts gefunden, dass mir eine Antwort gibt. Auch hilft hier keine Eigenschaft in der anderen Klasse die die AddressLists beinhaltet.

          So langsam bekomme ich schlechte Laune (**GRINS**).

          Comment


          • #6
            So, hier eine Lösung:
            Nach dem erstellen eines Outlook-Formularbereichs steht eine ThisAddIn.Cs zur Verfügung mit generiertem Code.

            Hier werden dann die entsprechenden Vorgänge durchgeführt um auf die Daten im Outlook zugreifen zu können.

            In der Methode
            [highlight=c#]
            private void ThisAddIn_Startup(object sender, System.EventArgs e)
            {
            GetDefaultContactFolder();

            CalendarFolder = Application.ActiveExplorer().Session.GetDefaultFol der(Outlook.OlDefaultFolders.olFolderCalendar);
            SetBeforeDeletionHandler();
            }
            [/highlight]
            rufe ich GetDefaultContactFolder() auf.
            [highlight=c#]
            internal void GetDefaultContactFolder()
            {
            Outlook.AddressLists addrLists = this.Application.Session.AddressLists;

            var listOutlookFolder =
            (from Outlook.AddressList addrList
            in addrLists
            where addrList != null
            select addrList.GetContactsFolder()).OfType<Outlook.Folde r>().ToList();

            FormContactsFinder.listOutlookFolder = listOutlookFolder;
            }
            [/highlight]

            In der Klasse FormContactsFinder befindet sich die Eigenschaft und der Suchvorgang.
            Hier ein Beispiel
            [highlight=c#]

            public static List<Outlook.Folder> ListOutlookFolderParam { get; set; }

            private void FindContacts( string target)
            {
            #region Variablen
            int progressCount = 0;
            int step = 0;
            int max = progressCount;
            int counter = 0;
            string findLastName = target;
            #endregion

            if (ListOutlookFolderParam == null) return; //Es sind keine Werte übergeben worden

            //max-Anzahl für Progressbar ermitteln
            #region Max-Anzahl für die Progressbar ermitteln
            for (int progInt = 0; progInt < ListOutlookFolderParam.Count; progInt++)
            {
            progressCount += ListOutlookFolderParam[progInt].Items.Count;
            Debug.WriteLine(progressCount);
            }
            #endregion
            //Adressordner durchgehen
            #region Adressordner durchsuchen
            foreach (Outlook.Folder theFolder in ListOutlookFolderParam)
            {
            if (theFolder != null)
            {
            updateProgress( step++ * 100 / max );

            Outlook.Items theFolderItems = theFolder.Items;

            Debug.WriteLine("theFolder.Name = " + theFolder.Name);

            foreach (Outlook.ContactItem foundContact in theFolderItems)
            {
            if (foundContact.LastName != null)
            {
            Debug.WriteLine(counter + ". " + foundContact.FullName);

            if (foundContact.LastName.Contains(findLastName))
            {
            Debug.WriteLine("foundContact.FullName = " + foundContact.FullName);
            counter++;
            }
            }
            }
            }
            }
            #endregion

            }
            [/highlight]

            Hinweis!!!
            Das ist nur ein Codeausschnitt.

            Gruß Lerando

            Comment

            Working...
            X