Outlook Addin functions only one time after Outlook is started

  • Thread starter Thread starter Mo
  • Start date Start date
M

Mo

Hi,

I wrote a simple add-in to copy the content of a selected email to
database. it works fine if you startup the outlook, select an email
and press the addin button. but any click after that does not do
anything. Any ideas on what I am doing wrong?

Here is my code

using System;
using System.Windows.Forms;
using Microsoft.VisualStudio.Tools.Applications.Runtime;
using Outlook = Microsoft.Office.Interop.Outlook;
using Office = Microsoft.Office.Core;

namespace CreateOutlookTicket
{
public partial class ThisAddIn
{
myTableAdapters.TicketsTableAdapter Tickets = new
CreateOutlookTicket.myTableAdapters.TicketsTableAdapter();
private void ThisAddIn_Startup(object sender, System.EventArgs
e)
{
string COMMANDBAR_NAME = "addin";
Office.CommandBar myBar;
Office.CommandBarButton myButton;
myBar =
this.Application.ActiveExplorer().CommandBars.Add(COMMANDBAR_NAME,
Office.MsoBarPosition.msoBarTop, false, true);
myBar.Visible = true;

string BUTTON_NAME = "Create Ticket";
myButton =
(Office.CommandBarButton)myBar.Controls.Add(Office.MsoControlType.msoControlButton,
Type.Missing, Type.Missing, Type.Missing, true);
myButton.Caption = BUTTON_NAME;
myButton.Style =
Office.MsoButtonStyle.msoButtonIconAndCaption;
myButton.Enabled = true;
myButton.Click += new
Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler(myButton_Click);



}

void myButton_Click(Microsoft.Office.Core.CommandBarButton
Ctrl, ref bool CancelDefault)
{
foreach (object item in
Application.ActiveExplorer().Selection)
{
Outlook.MailItem mi = item as Outlook.MailItem;
if (mi != null)
{
try
{

int
TicketID=Convert.ToInt32(Tickets.GetInsertID(mi.SenderName,
mi.SenderEmailAddress, "myadin", mi.SentOn, "General",
mi.Subject, mi.Body, null, "Open", null,
null));

Outlook.MAPIFolder outBoxfolder =
this.Application.GetNamespace("MAPI").GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderOutbox);
Outlook.MailItem mailitem =
(Outlook.MailItem)outBoxfolder.Items.Add(Outlook.OlItemType.olMailItem);
mailitem.Subject = "New Ticket
#"+TicketID.ToString()+" Has Been Created";
mailitem.Body = "A new ticket has been
created. Please visit ticketing system for details";
mailitem.To = "xxx.xx.xxx";
mailitem.Send();
System.Windows.Forms.MessageBox.Show("Ticket
"+TicketID.ToString()+" Created", "Ticket Manager");

}
catch (Exception ex)
{

System.Windows.Forms.MessageBox.Show(ex.Message, "Ticket Manager");
}

}
else
{
System.Windows.Forms.MessageBox.Show("Select an
Email", "Ticket Manager");
}


}
}

private void ThisAddIn_Shutdown(object sender,
System.EventArgs e)
{
}

#region VSTO generated code

/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InternalStartup()
{
this.Startup += new
System.EventHandler(ThisAddIn_Startup);
this.Shutdown += new
System.EventHandler(ThisAddIn_Shutdown);
}

#endregion
}
}
 
Mo said:
Hi,

I wrote a simple add-in to copy the content of a selected email to
database. it works fine if you startup the outlook, select an email
and press the addin button. but any click after that does not do
anything. Any ideas on what I am doing wrong?

C# I take it? I don't see any exception handling, any unhandled exceptions
within an AddIn will effectively shut it down. Try wrapping your code in a
try/catch block. (I seem to recall C# support for try/catch/finally.)


-Mark
 
Mark,

I have try/catch in the code and there are no exceptions when I debug
it. The first time you click the add-in button everything works fine
and you can debug right through it. After that even in debug mode the
button click event is not triggered.

Mo
 
Mo said:
Mark,

I have try/catch in the code and there are no exceptions when I debug
it. The first time you click the add-in button everything works fine
and you can debug right through it. After that even in debug mode the
button click event is not triggered.

Weird. Maybe put a call th OutputDebugString() (Win32 API) in the class
destructor, or maybe a do-nothing line of code that you can set a breakpoint
on -- some way to know when the class unloads. Or maybe add a dummy button,
to give yourself a way into a breakpoint/a way to examine the object in the
debugger after it breaks.

Sadly, you couldn't fill a thimble with what I know specifically about C#,
but logically (or so it seems to me) either your class is being unloaded, or
whatever hooks it into the button is being lost/cancelled/overwritten.

Does myButton need to be declared at class scope, rather than function
scope? (I'm just grasping at straws, now.)

Sorry I don't have more for you.


-Mark
 
Your button object is going out of scope and is being garbage collected,
therefore it won't fire again on a click.

That's a very common problem in managed code if you don't declare your
objects at the correct scope level.

Declare your button object at the class level and not within Startup(). Then
in Startup() you instantiate the object, it will remain alive until you
release it explicitly.
 
Back
Top