不幸的是,我无法弄清楚如何执行以下操作:
我正在 VSTO / .NET / C# 中开发一个 Excel 插件。
我已经能够找出如何在工作表中获取对 ActiveX 控件的引用。可以通过 worksheet.OLEObjects 集合。
如果我知道按钮的名称,我可以在该集合中搜索特定按钮。到目前为止,一切都很好。
但是现在:如何注册一个在单击按钮时调用的事件处理程序?
不幸的是,我无法弄清楚如何执行以下操作:
我正在 VSTO / .NET / C# 中开发一个 Excel 插件。
我已经能够找出如何在工作表中获取对 ActiveX 控件的引用。可以通过 worksheet.OLEObjects 集合。
如果我知道按钮的名称,我可以在该集合中搜索特定按钮。到目前为止,一切都很好。
但是现在:如何注册一个在单击按钮时调用的事件处理程序?
现在找到了一个解决方案,那里: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 () {
// ...
}
这不太可能仍然与您相关,但可能对其他人有用。我发现 LateGet 很古怪,我用这个代替:
foreach (Worksheet sheet in excelApp.Worksheets)
{
foreach (Shape obj in sheet.Shapes)
{
CommandButton xx = sheet.OLEObjects(obj.Name).Object;
xx.Click += xxClicked;
}
}