2
votes

We have an Outlook add-in. We need to programmatically cancel a task assignment in the TaskItem Inspector window, just the way the Cancel Assignment button does.

One would think that calling TaskItem.CancelResponseState() might work. Although it does cancel the assignment, it also leaves the task in an unassignable state. The Assign Task button on the ribbon is disabled.

In Outlook 2007 and 2010, we can get the CommandBarButton object for the Cancel Assignment button and call its Execute() method. This gives us the desired behavior. However, in Outlook 2013, this command bar button no longer exists. That's not surprising since Inspector command bars were replaced by the Ribbon in 2007. The CommandBarButton object still existed programmatically, though, for backward compatibility. With Outlook 2013, Microsoft has finally removed this object.

So the question is: Is there a way to programmatically "click" on a ribbon button? If not, is there another way to cancel the task assignment the way the ribbon button does it?

1

1 Answers

4
votes

You can try to use Redemption and its SafeRibbon object:

'simulate a click on the "Assign Task" button of an active Inspector
set sInspector = CreateObject("Redemption.SafeInspector")
sInspector.Item = Application.ActiveInspector
set Ribbon = sInspector.Ribbon
oldActiveTab = Ribbon.ActiveTab
Ribbon.ActiveTab = "Task"
set Control = Ribbon.Controls("Assign Task")
Control.Execute
Ribbon.ActiveTab = oldActiveTab 'restore the active tab

EDIT. In C#, it would be something like the following (assuming you added Redemption to your project references):

//simulate a click on the "Assign Task" button of an active Inspector
Redemption.SafeInspector sInspector = new Redemption.SafeInspector();
sInspector.Item = Application.ActiveInspector;
Redemption.SafeRibbon Ribbon = sInspector.Ribbon;
string oldActiveTab = Ribbon.ActiveTab;
Ribbon.ActiveTab = "Task";
Redemption.SafeRibbonControl Control = Ribbon.Controls.Item("Assign Task");
Control.Execute();
Ribbon.ActiveTab = oldActiveTab; //restore the active tab