注册到ActiveX控件的OnClick事件

时间:2014-06-02 20:53:23

标签: c# excel vsto activex eventhandler

不幸的是,我无法弄清楚如何执行以下操作:

我正在开发VSTO / .NET / C#中的Excel加载项。

我已经能够找到如何在工作表中获取对ActiveX控件的引用。可以通过worksheet.OLEObjects集合。

如果我知道按钮的名称,我可以搜索该特定按钮的集合。到目前为止,非常好。

但是现在:如何注册单击按钮时调用的事件处理程序?

3 个答案:

答案 0 :(得分:0)

现在找到一个解决方案:http://blogs.msdn.com/b/vsod/archive/2009/10/02/excel-how-to-run-c-code-behind-with-a-click-of-a-button-on-a-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 () {
   // ...
}

答案 1 :(得分:0)

这不太可能对您有用,但可能对其他人有用。我发现LateGet很古怪,我用它代替:

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

答案 2 :(得分:0)

我正在寻找相同的解决方案,但还没有找到。 您的建议是使用表单控件[A] 而不是 ActiveX控件[B]

enter image description here

否则,当循环通过worksheet.OLEObjects时,你必须以某种方式从[A]到[B]投射它们。 您是否找到了与ActiveX控件相同的方法? 我还没有找到一种方法来正确引用它们的 dll 和表单[A]:... Microsoft.Vbe.Interop.Forms.dll

一旦[A]成为参考,我就可以访问他们的活动。能为[B]做同样的事情会很好。

顺便说一下,你不能在事件头中使用(sender as Object, e...),如果你为多个按钮使用相同的处理程序,那么控件触发事件会很困难。

相关问题