Auteur de questions
Outlook 2007, Ajout d'items dans le menu contextuel : Probléme d'évenement Click qui se déclenche plusieur fois.

Question
-
Salutation,
J'ai écris un addin Pour Outlook 2007, celui ci doit afficher des options supplémentaires dans le menu contextuel. L'ajout et l'affichage des items fonctionnent correctement mais l'evenement associé se déclenche plusieurs fois sans raison.
Descriptif détaillée :
-L'addin cible le menu contact d'Outlook.
-L'objectif et de capturer un ContactItem existant et selon les propriété de celui-ci on ajoute des items dans le context menu
Code utilisé :
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
this.Application.ItemContextMenuDisplay += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_ItemContextMenuDisplayEventHandler(Application_ItemContextMenuDisplay);
}
Pour pouvoir coder sur l'événement de l'affichage du menu contextuel
void Application_ItemContextMenuDisplay(Microsoft.Office.Core.CommandBar commandBar, Microsoft.Office.Interop.Outlook.Selection selection)
{
CommandBarPopup rootButton = null;
ContactItem contactSelect = null;
MsoControlType linkType = MsoControlType.msoControlButton;
if (Application.ActiveExplorer().Selection[1] is ContactItem)
{
try
{
contactSelect = (ContactItem)Application.ActiveExplorer().Selection[1];
rootButton = (CommandBarPopup)commandBar.Controls.Add(Office.MsoControlType.msoControlPopup, Type.Missing, "Mon_Menu", commandBar.Controls.Count + 1, Type.Missing);
rootButton.BeginGroup = true;
rootButton.Tag = "Mon_Menu";
rootButton.Caption = "Mon Menu...";
rootButton.Visible = true;
if (contactSelect.BusinessTelephoneNumber != null)
{
CommandBarControl folderLink = rootButton.Controls.Add(linkType, Type.Missing, "BusinessTelephoneNumber", 1, Type.Missing);
folderLink.Tag = "BusinessTelephoneNumber";
// folderLink.Caption = "Business Telephone Number : " + contactSelect.BusinessTelephoneNumber;
folderLink.Caption = "Bureau : " + contactSelect.BusinessTelephoneNumber;
(folderLink as CommandBarButton).Click += new _CommandBarButtonEvents_ClickEventHandler(ControlTel_Click);
}
//.................................................................................
// 15 autres tests sont effectués
// Selon le même schéma
// Mais sur des propriétés différentes
//................................................................................
if (contactSelect.TTYTDDTelephoneNumber != null)
{
CommandBarControl folderLink = rootButton.Controls.Add(linkType, Type.Missing, "TTYTDD Telephone Number", 1, Type.Missing);
folderLink.Tag = "TTYTDDTelephoneNumber";
folderLink.Caption = "TTY/TDD : " + contactSelect.TTYTDDTelephoneNumber;
(folderLink as CommandBarButton).Click += new _CommandBarButtonEvents_ClickEventHandler(ControlTel_Click);
}
}
catch (InvalidCastException e)
{
MessageBox.Show("Contacter le service support :" + e.Message.ToString());
}
}
}
La méthode appelée lors du click est la suivante :
void ControlTel_Click(Microsoft.Office.Core.CommandBarButton Ctrl, ref bool CancelDefault)
{
String numero = Ctrl.accName;
Form1 formAppel = new Form1(numero.Substring(numero.IndexOf(':') + 2));
formAppel.Show();
}
La form appelée procède ensuite au traitement désiré et accepte bien entendu un constructeur de type string en entrée.
Problématique :
Toutes cette procédure fonctionne correctement lors d'un premier usage mais après quelque usage (le nombre est aléatoire) plusieurs fenêtres (form1) seront affichées.
Après Debug il s'agit en faite d'un problème d'appel de la fonction, l'événement click est généré plusieurs fois.
Seul solution de contournement, créer un booleen afin de ne pas traiter plus d'une fenêtre à la fois, le booleen aura la valeur false si aucune fenêtre n'est ouverte et true si la fenêtre est ouverte :
void ControlTel_Click(Microsoft.Office.Core.CommandBarButton Ctrl, ref bool CancelDefault)
{ //utilisation d'un booleen pour bloquer l'ouverture de plus d'une fenêtre
if (!uneForm)
{
String numero = Ctrl.accName;
Form1 formAppel = new Form1(numero.Substring(numero.IndexOf(':') + 2));
formAppel.Show();
uneForm = true;
}
}
Ici uneForm est ma variable booléenne. A la fermeture de la fenêtre, ou à sa validation, la valeur de la variable est repassée à fausse.
Le procédé permet ici de rendre l'utilisation de l'addin opérationnel mais n'explique pas le phénomène.
Question :
Pourquoi ai-je une multitude d'appel de ma fonction ControlTel_Click alors qu'un seul événement click a eu lieu ?
Ma construction est elle fausse ?
Cordialement,
Nyourk
mardi 6 juillet 2010 12:07
Toutes les réponses
-
Bonjour,
Il me semble que tu rajoutes l'event à chaque fois que ton menu est affiché.. Du coup, la première fois tu auras seulement un appel de la fonction ControlTel_Click, mais à chaque fois que tu ouvres le menu contextuel, l'event sera executé une fois de plus.
En gros, tu ouvres N fois ton menu, tu auras N occurences de ControlTel_Click.
Merci pour le code sinon!
Cordialement,
Thomas
- Proposé comme réponse RadigouTD mardi 15 mars 2011 10:14
mardi 15 mars 2011 10:13