使用 C# 将自定义命令栏菜单添加到特定的 excel table
add custom commandbar menu to a specific excel table using c#
我在 table 右键单击中有一个自定义命令栏菜单,但我需要它特定于一个 table 并且不希望它显示在任何其他 table 上秒。这可能吗?
如果没有,还有其他建议吗?
editSourceBtn = (Office.CommandBarButton)tableCommandBar.Controls.Add(1, missing, missing, missing, missing);
editSourceBtn.Style = Office.MsoButtonStyle.msoButtonCaption;
editSourceBtn.Caption = "Edit Source";
editSourceBtn.Tag = "Edit Source";
editSourceBtn.Click +=new Office._CommandBarButtonEvents_ClickEventHandler(editSourceBtn_Click);
是的,这是可能的。但事实是不再使用命令栏。他们被弃用了。您需要改用 Fluent UI 控件。您可以使用回调,例如 getEnabled 或 getVisible,并且在需要时您可以调用 IRibbonUI 接口的 Invalidate 或 InvalidateControl 方法来调用您的回调。
Dim MyRibbon As IRibbonUI
Sub MyAddInInitialize(Ribbon As IRibbonUI)
Set MyRibbon = Ribbon
End Sub
Sub myFunction()
// Invalidates the caches of all of this add-in’s controls
MyRibbon.Invalidate()
End Sub
您可以在 MSDN 中的以下系列文章中阅读有关功能区 UI 的更多信息:
我找到了解决方案,我在一个特定的选项卡中有一个 table 并且想要右键单击上下文,如果 sheet 是我的那个,我在 if 语句中指定它需要并且所选范围与 table 范围相交,它会添加右键单击按钮。
private void Application_SheetBeforeRightClick(object Sh, Excel.Range Target, ref bool Cancel)
{
Excel.Range ResourceTable;
Excel.Range IntersectRange;
foreach (Office.CommandBarControl ctrl in tableCommandBar.Controls)
{
if (ctrl.Tag == "Edit" || ctrl.Tag == "Delete") ctrl.Delete();
}
editBtn = null;
if (this.Application.ActiveSheet.Name == "Mysheet" && this.Application.ActiveSheet.ListObjects.Count > 0)
{
ResourceTable = this.Application.ActiveWorkbook.Worksheets["Mysheet"].ListObjects["myTable"].Range;
IntersectRange = this.Application.Intersect(ResourceTable, Target);
if (IntersectRange != null & ResourceTable.Rows.Count > 2 && editSourceBtn == null)
{
editBtn = (Office.CommandBarButton)tableCommandBar.Controls.Add(1, missing, missing, missing, missing);
editBtn.Style = Office.MsoButtonStyle.msoButtonCaption;
editBtn.Tag = "Edit";
editBtn.Click += new Office._CommandBarButtonEvents_ClickEventHandler(editSourceBtn_Click);
}
}
}
希望对您有所帮助。
我在 table 右键单击中有一个自定义命令栏菜单,但我需要它特定于一个 table 并且不希望它显示在任何其他 table 上秒。这可能吗? 如果没有,还有其他建议吗?
editSourceBtn = (Office.CommandBarButton)tableCommandBar.Controls.Add(1, missing, missing, missing, missing);
editSourceBtn.Style = Office.MsoButtonStyle.msoButtonCaption;
editSourceBtn.Caption = "Edit Source";
editSourceBtn.Tag = "Edit Source";
editSourceBtn.Click +=new Office._CommandBarButtonEvents_ClickEventHandler(editSourceBtn_Click);
是的,这是可能的。但事实是不再使用命令栏。他们被弃用了。您需要改用 Fluent UI 控件。您可以使用回调,例如 getEnabled 或 getVisible,并且在需要时您可以调用 IRibbonUI 接口的 Invalidate 或 InvalidateControl 方法来调用您的回调。
Dim MyRibbon As IRibbonUI
Sub MyAddInInitialize(Ribbon As IRibbonUI)
Set MyRibbon = Ribbon
End Sub
Sub myFunction()
// Invalidates the caches of all of this add-in’s controls
MyRibbon.Invalidate()
End Sub
您可以在 MSDN 中的以下系列文章中阅读有关功能区 UI 的更多信息:
我找到了解决方案,我在一个特定的选项卡中有一个 table 并且想要右键单击上下文,如果 sheet 是我的那个,我在 if 语句中指定它需要并且所选范围与 table 范围相交,它会添加右键单击按钮。
private void Application_SheetBeforeRightClick(object Sh, Excel.Range Target, ref bool Cancel)
{
Excel.Range ResourceTable;
Excel.Range IntersectRange;
foreach (Office.CommandBarControl ctrl in tableCommandBar.Controls)
{
if (ctrl.Tag == "Edit" || ctrl.Tag == "Delete") ctrl.Delete();
}
editBtn = null;
if (this.Application.ActiveSheet.Name == "Mysheet" && this.Application.ActiveSheet.ListObjects.Count > 0)
{
ResourceTable = this.Application.ActiveWorkbook.Worksheets["Mysheet"].ListObjects["myTable"].Range;
IntersectRange = this.Application.Intersect(ResourceTable, Target);
if (IntersectRange != null & ResourceTable.Rows.Count > 2 && editSourceBtn == null)
{
editBtn = (Office.CommandBarButton)tableCommandBar.Controls.Add(1, missing, missing, missing, missing);
editBtn.Style = Office.MsoButtonStyle.msoButtonCaption;
editBtn.Tag = "Edit";
editBtn.Click += new Office._CommandBarButtonEvents_ClickEventHandler(editSourceBtn_Click);
}
}
}
希望对您有所帮助。