2012-07-23 13 views
5

Ich schreibe ein Outlook-Add-In und möchte etwas (nicht relevant hier) mit den Daten eines Termins nach (wann) es gespeichert wurde.
(ich bin neu in Outlook-Addins)
so fand ich, dass es ein AfterWrite Ereignis gibt, wo ich eine Methode registrieren kann. Und es gibt eine ItemLoad Ereignis auf Anwendung.Ereignis nach dem Speichern eines Outlook-Termins

so meine erste Efford war so etwas wie diese:

private void ThisAddIn_Startup(object sender, System.EventArgs e) 
{ 
    // ... 
    this.Application.ItemLoad += 
     new Outlook.ApplicationEvents_11_ItemLoadEventHandler(atItemLoad); 
} 
public void atItemLoad(Object item) 
{ 
    Outlook.AppointmentItem aitem = item as Outlook.AppointmentItem; 
    if (aitem != null) 
    { 
     aitem.AfterWrite += 
      new Outlook.ItemEvents_10_AfterWriteEventHandler(afterWrite); 
    } 
} 
public void afterWrite() 
{ 
    // Who was written? 
    MessageBox.Show("it was written!"); 
} 

Das Problem ist, dass ich weiß nicht, wie man die Daten des Termins zu bekommen, die das Ereignis ausgelöst. Application.ItemLoad registriert eine Funktion, die ein Objekt erhält, das in einen Termin umgewandelt werden kann.
AfterWrite nicht. Ich würde so etwas wie dies mag:

public void afterWrite(Outlook.AppointmentItem aitem) 
{ 
    // do something with the data from the Appointment 
    MessageBox.Show(aitem.Subject + " was written!"); 
} 

Ich fürchte, dass ich in der völlig falsche Richtung suche ..

* sorry, wenn mein Englisch ist ein Durcheinander - es ist nicht meine Muttersprache

edit:

ich versuchte sogar ein Konstrukt wie folgt aus:

private List<AppointmentEventHolder> holderList = new List<AppointmentEventHolder>(); 

internal class AppointmentEventHolder 
{ 
    private Outlook.AppointmentItem aitem = null; 
    public AppointmentEventHolder(Outlook.AppointmentItem item) 
    { 
     aitem = item; 
    } 

    public void onWrite() 
    { 
     MessageBox.Show("write: " + aitem.Subject); 
    } 
} 

public void atItemLoad(Object item) 
{ 
    Outlook.AppointmentItem aitem = item as Outlook.AppointmentItem; 
    if (aitem != null) 
    { 
     AppointmentEventHolder aHolder = new AppointmentEventHolder(aitem); 
     holderList.Add(aHolder); 
     aitem.AfterWrite += aHolder.onWrite; 
    } 
} 

aber Ereignis wird nicht gefeuert! ich bin jetzt sehr frustriert

Antwort

6

ok, ich denke, ich habe das.
Sie müssen einen Handler auf dem Ordner registrieren, der Ihre Termine hat.

ich lese und erfuhr mich selbst, dass es ein Muss ist, einen Verweis auf die Objekte zu speichern, die Sie ein Ereignis registrieren, also tat ich dies.
das ist also der Code

private Outlook.MAPIFolder _CalendarFolder = null; 
private Outlook.Items _CalendarItems = null; 

private void ThisAddIn_Startup(object sender, System.EventArgs e) 
{ 
    Outlook.MAPIFolder calendarFolder = 
     this.Application.ActiveExplorer().Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar); 

    // get the Termine24-Folder (if not found, create it) 
    try 
    { 
     _CalendarFolder = calendarFolder.Folders[Constants.FOLDERNAME]; 
    } 
    catch 
    { 
     _CalendarFolder = calendarFolder.Folders.Add(Constants.FOLDERNAME); 
    } 
    _CalendarItems = _CalendarFolder.Items; 
    attachEvents(); 

} 
public void attachEvents() 
{ 
    _CalendarItems.ItemAdd += Item_Add; 
    _CalendarItems.ItemChange += Item_Change; 
    _CalendarItems.ItemRemove += Item_Remove; 
} 
public void Item_Add(Object item) 
{ 
    Outlook.AppointmentItem aitem = item as Outlook.AppointmentItem; 
    if (aitem != null) 
    { 
     MessageBox.Show("add: " + aitem.Subject); 
    } 
    else 
    { 
     MessageBox.Show("add, but no appointment"); 
    } 
} 
public void Item_Change(Object item) 
{ 
    Outlook.AppointmentItem aitem = item as Outlook.AppointmentItem; 
    if (aitem != null) 
    { 
     MessageBox.Show("changed: " + aitem.Subject); 
    } 
    else 
    { 
     MessageBox.Show("change, but no appointment"); 
    } 
} 
public void Item_Remove() 
{ 
    MessageBox.Show("Item_remove"); 
} 

zu gute Sache ist, dass jetzt auch ein Ereignis, wenn ich den Termin bekommt per Drag-and-fiel in der Übersicht.

ABER die Item_Remove bekomme ich immer noch nicht das Objekt, das entfernt wurde.

+0

Was ist der "** Constants.FOLDERNAME **", auf den sich Ihr C# -Code bezieht? Ohne zu wissen, worauf sich diese Konstante bezieht, kann ich Ihren Code nicht erstellen. –

+2

'private MAPIFolder GetCalendarFolder() {var app = neue Microsoft.Office.Interop.Outlook.Application(); NameSpace nameSpace = app.GetNamespace ("MAPI"); Rückgabe nameSpace.GetDefaultFolder (OlDefaultFolders.olFolderCalendar); } '** Verwenden Sie diese Methode, um das Outlook.MAPIFolder-Standardobjekt abzurufen ** –

Verwandte Themen