6 min to read
Outlook i addin 2/2

Zgodnie z zapowiedzią w pierwszej części dzisiaj pokażę, jak:
- dodać grupę do istniejącej zakładki
- podpiąć formularz
- przekazać istniejący obiekt spotkania do formularza
- przekazać dane do exchange’a
- odnaleźć się w dokumentacji
[1] Aby dodać stworzoną przez nas grupę do istniejącej zakładki wystarczy zrobić tak naprawdę 2 rzeczy:
- zmienić w właściwościach kontrolki RibbonType właściwość z grupy/sekcji/zakładki/? ControlId -> ControlIdType z Custom na Office
- ustawić OfficeId na istniejące np. TabAppointment
Skąd wiedziałem jaką wartość ustawić w OfficeId? Znalazłem w dokumentacji. W dokumentacji są pliki xlsx z listami kontrolek i tam w pliku outlookexplorercontrols.xslx ją sobie znalazłem… [wp-svg-icons icon=”cool” wrap=”i”] Chociaż bardziej cool byłoby gdybym napisał, że zgadłem
Inne przykładowe wartości pola OfficeId:
- None
- TabMail
- TabAttachments
- TabCalendar
- TabContacts
- TabSendReceive
- TabMessage
- TabCalendarTableView
- TabNotes
Lista kontrolek outlook: outlook explorer controls.xlsx
[2] Dodawanie własnych formularzy jest proste jak budowa cepa
Dodajesz nowy element, wybierasz “Outlook Form Region”.
Pojawia się okienko wyboru - wybieramy “Design a new form region”.
Po dodaniu formularza i wrzuceniu na niego testowej “label’ki” uruchamiany aplikację i sprawdzamy efekt. Powinno się pokazać coś takiego:
Nasza grupa “Pogodynka” przeniosła się do zakładki spotkanie, a do grupy pokazywanie dodał się formularz.
Przedstawiłem Outlook Form Region tylko dla zajawki [wp-svg-icons icon=”smiley” wrap=”i”] Teraz go usuwam i dodaje nowy element do projektu z grupy Windows Forms -> Windows Forms.
W klasie SunTab dodaje metodę ShowForm która ma pokazać świeżo dodaną kontrolkę po kliknięciu przycisku “Sprawdź pogodę”.
public partial class SunTab
{
private void BtnCheckWeather(object sender, RibbonControlEventArgs e)
{
ShowForm();
}
private HelloForm _form1;
private void ShowForm()
{
if (_form1 == null)
{
_form1 = new HelloForm();
}
_form1.ShowDialog();
}
}
Zaprojektowałem prosty formularz z kontrolkami numeric i button. Do zdarzenia kliknięcia przycisku podpiąłem wyświetlanie kolejnego okna.
private void ButtonPrintTemperature(object sender, EventArgs e)
{
MessageBox.Show($"Dzień dobry! Dziś na dworzu {ageNumeric.Value} stopni :)");
}
Odpalamy aplikację i rzeczywiście, mamy w naszej grupie przycisk,
który po kliknięciu reaguje stworzeniem nowego okna,
w którym możemy podać temperaturę, a następnie ją wyświetlić
[3] Ok, mamy już kilka ciekawych rzeczy związanych głównie z GUI, ale jak przekazać dane? Oczywiście możemy dodać nowy formularz, który będzie dodawał coś do tytułu/treści wiadomości, ale to nie jest fajne.
Fajne byłoby dodanie do wiadomości, naszego własnego atrybutu, do którego moglibyśmy wrzucić co tylko nam się podoba.
Spotkanie w Outlooku to nic innego jak wiadomość email, do której można dodać swoje “extended properties”. Wspomniane “extended properties” obsługiwane są jedynie przez Exchange’a.
Pierwszym krokiem jest uczynienie publicznym i przekazanie do naszego formularza referencji do obiektu spotkania. W głównej klasie AddIn’a dodajemy inspektora, który przy starcie ustawi nam obiekt spotkania.
using Outlook = Microsoft.Office.Interop.Outlook;
public partial class ThisAddIn
{
private Outlook.Inspectors _inspectors;
public Outlook.AppointmentItem AppointmentItem;
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
_inspectors = Application.Inspectors;
_inspectors.NewInspector += Inspectors_NewInspector;
}
private void Inspectors_NewInspector(Outlook.Inspector inspector)
{
var appointmentItem = inspector.CurrentItem as Outlook.AppointmentItem;
if (appointmentItem != null)
{
AppointmentItem = appointmentItem;
}
}
W zakładce SunTab przechodzimy do metody pokazującej formularz i przekazujemy spotkanie np. przez konstruktor.
private void ShowForm()
{
if (_form1 == null)
{
_form1 = new HelloForm(Globals.ThisAddIn.AppointmentItem);
}
_form1.ShowDialog();
}
Po czym dodajemy do niego parametr:
private readonly AppointmentItem _appointmentItem;
public HelloForm(AppointmentItem appointmentItem)
{
_appointmentItem = appointmentItem; InitializeComponent();
}
[4] Teraz wystarczy tylko do obiektu spotkania dodać coś od siebie. Jak to zrobić?
Również całkiem prosto - pod warunkiem, że się wie, albo ma się dobry przykład
Do formularza dodajemy metodę inicjowania właściwości i modyfikujemy metodę wyświetlającą wiek.
Teraz będzie również przekazywała tajną informację
private void ButtonPrintTemperature(object sender, EventArgs e)
{
MessageBox.Show($"Dzień dobry! Dziś na dworzu {ageNumeric.Value} stopni :)");
var properties = _appointmentItem.UserProperties;
var secretData = new SecretData
{
Age = ageNumeric.Value
};
try
{
InitProperty(properties, secretData);
} catch (UnauthorizedAccessException)
{
InitProperty(properties, secretData);
}
}
private static void InitProperty(UserProperties properties, SecretData secretData)
{
var property = properties.Add("secretData", OlUserPropertyType.olText);
property.Value = JsonConvert.SerializeObject(secretData);
}
Nie pytajcie dlaczego zrobiłem dwa razy InitProperty w try catch… to exchange
Z jakiegoś magicznego powodu pojedyńcza inicjalizacja rzuca wyjątek - rozwiązanie jest banalne… try catch i po sprawie… trudno.
W każdym razie, teraz po kliknięciu na przycisk, powinna się dodać do wiadomości wysyłanej do Exchange’a, informacja o wieku.
Jeżeli macie Exchange’a, to można to w łatwy sposób sprawdzić, a jeżeli nie… to cóż
[5] Poruszanie się po dokumentacji jest dosyć ciekawe i niestety nie ma na to złotego środka.
Jedyny tip od mnie to ten zawarty w punkcie pierwszym.
Jeżeli szukasz - dajmy na to… nazwy zakładki zgadnij ją sobie w excelu
**Have Fun! **
Comments