2012-07-23 10 views
5

Estoy escribiendo un complemento de Outlook y quiero hacer algo (no relevante aquí) con los datos de una cita después de (cuándo) se guardó.
(soy nuevo en Outlook-Addins)
así que encontré que hay un evento AfterWrite donde puedo registrar un Método. Y hay un evento ItemLoad en Aplicación.Evento después de guardar una cita de Outlook

así que mi primera Efford fue algo como esto:

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!"); 
} 

El problema es que no sé cómo llegar a los datos de la cita, que generó el evento. Application.ItemLoad registra una función que obtiene un Objeto, que se puede convertir en Cita.
AfterWrite no lo hace. Me gustaría algo como esto:

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

Me temo que estoy investigando en la dirección totalmente equivocada ..

* lo siento si mi Inglés es un desastre - no es mi lengua materna

edit:

que incluso intentó una construcción como esta:

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; 
    } 
} 

pero evento no se dispara! estoy muy frustrado ahora

Respuesta

6

bien, creo que tengo esto.
Debe registrar un controlador en la Carpeta, que tiene sus citas.

me leí y experimenté a mí mismo, que es crucial para guardar una referencia a los objetos que registra un evento, así que lo hice.
de modo que sea el código

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"); 
} 

a bueno es que ahora también consigo un evento si la cita se pone arrastrar y caer en el resumen.

PERO el Item_Remove todavía no me consigue el Objeto que se eliminó.

+0

¿Qué es "** Constants.FOLDERNAME **" al que se refiere el código de C#? Sin saber a qué se refiere esta constante, no puedo construir tu código. –

+2

'private MAPIFolder GetCalendarFolder() {var app = new Microsoft.Office.Interop.Outlook.Application(); NameSpace nameSpace = app.GetNamespace ("MAPI"); return nameSpace.GetDefaultFolder (OlDefaultFolders.olFolderCalendar); } '** Utilice este método para obtener el objeto predeterminado Outlook.MAPIFolder ** –

Cuestiones relacionadas