Регистрация в событии OnClick элемента управления ActiveX

К сожалению, я не смог понять, как сделать следующее:

Я разрабатываю надстройку Excel в VSTO/.NET/С#.

Мне удалось узнать, как получить ссылки на элементы управления ActiveX на листе. Это возможно через коллекцию worksheet.OLEObjects.

Я могу искать в этой коллекции определенную кнопку, если знаю ее название. Все идет нормально.

Но теперь: как я могу зарегистрировать обработчик событий, который вызывается при нажатии кнопки?


person JohnB    schedule 02.06.2014    source источник


Ответы (2)


Теперь нашел решение: http://blogs.msdn.com/b/vsod/archive/2009/10/02/excel-how-to-run-c-code-behind-with-a-click-of-a-button-on-the-worksheet-without-vba-code.aspx

using Microsoft.VisualBasic.CompilerServices;
using MSForms = Microsoft.Vbe.Interop.Forms;

// ...

// set name of button
var cmdButton = (Excel.Shape) ws.Shapes.Item (1);
cmdButton.Name = "btnClick";

// ...

// get button by name
var cb = (MSForms.CommandButton) NewLateBinding.LateGet (
   ws, // Worksheet object
   null, "btnClick", new object [0], null, null, null
);

// register event handler
cb.Click += click;

// ...

// event handler
void click () {
   // ...
}
person JohnB    schedule 03.06.2014
comment
но не могу знать, какая кнопка нажата. Вы знаете какой-нибудь обходной путь, чтобы получить отправителя? - person Mokh Akh; 26.12.2016
comment
Вы можете зарегистрировать отдельный обработчик для каждой кнопки. Возможно можно прописать лямбду (не пробовал): void click (int buttonNumber) { ... } ... cb.Click += (System.Action) ( () => { click(1); } ); cb2.Click += (System.Action) ( () => { click(2); } ); и т.д. - person JohnB; 27.12.2016
comment
У меня все работает, спасибо label.Click += (Microsoft.Vbe.Interop.Forms.LabelControlEvents_ClickEventHandler)(() => { string name = labelObj.Name; Label_Click(name); }); - person Mokh Akh; 29.12.2016

Вряд ли это все еще актуально для вас, но может быть полезно для кого-то еще. Я нашел LateGet довольно причудливым, вместо этого я использую это:

foreach (Worksheet sheet in excelApp.Worksheets)
{
    foreach (Shape obj in sheet.Shapes)
    {
        CommandButton xx = sheet.OLEObjects(obj.Name).Object;
        xx.Click += xxClicked;
    }
}
person anakic    schedule 12.03.2016