不幸的是,我无法弄清楚如何执行以下操作:
我正在开发VSTO / .NET / C#中的Excel加载项。
我已经能够找到如何在工作表中获取对ActiveX控件的引用。可以通过worksheet.OLEObjects集合。
如果我知道按钮的名称,我可以搜索该特定按钮的集合。到目前为止,非常好。
但是现在:如何注册单击按钮时调用的事件处理程序?
答案 0 :(得分:0)
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] :
否则,当循环通过worksheet.OLEObjects
时,你必须以某种方式从[A]到[B]投射它们。
您是否找到了与ActiveX控件相同的方法?
我还没有找到一种方法来正确引用它们的 dll 和表单[A]:... Microsoft.Vbe.Interop.Forms.dll
一旦[A]成为参考,我就可以访问他们的活动。能为[B]做同样的事情会很好。
顺便说一下,你不能在事件头中使用(sender as Object, e...)
,如果你为多个按钮使用相同的处理程序,那么控件触发事件会很困难。