我被困住了,希望能在这里得到一些帮助。我有一个Excel VSTO加载项,其中包含各种控件的功能区。除非具有特定名称的工作表处于活动状态,否则我希望禁用除一个控件之外的所有控件。这是如何完成的?到目前为止,我想出了如何将功能区按钮映射到ThisAddIn启动以使其保持活动状态,而其他按钮默认为禁用:
RibbonButton btx_newECO = Globals.Ribbons.Ribbon1.btn_ECOnumber;
btx_newECO.Enabled = true;
现在,当打开具有特定名称的工作表时,如何启用其他功能区按钮? `
答案 0 :(得分:0)
我的回答是假设使用功能区设计器在设计时定义了功能区。从您的代码中可以看出这就是您正在做的事情(而不是使用Ribbon XML)。
请注意,在Ribbon类的类级别声明了一个字段,并在ThisAddin_Startup事件中填充该字段,以便可以在加载项的“生命周期”期间随时使用它。
此外,还会实例化应用程序的SheetActivate事件。每次激活不同的工作表时都会触发此操作。如果检查工作表的名称。如果是正确的,则启用功能区按钮;否则按钮被禁用。
我在Ribbon Designer属性中默认将按钮设置为禁用。但是如果您愿意,也可以在Ribbon类Load事件中禁用它。
public partial class ThisAddIn
{
Ribbon1 rbn;
string triggerName = "X";
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
rbn = Globals.Ribbons.Ribbon1;
this.Application.SheetActivate += new Excel.AppEvents_SheetActivateEventHandler(Application_SheetActivate);
}
void Application_SheetActivate(object Sh)
{
Excel.Worksheet wsh = (Excel.Worksheet)Sh;
if (wsh.Name == triggerName)
{
rbn.btnMsg.Enabled = true;
}
else { rbn.btnMsg.Enabled = false; }
}
private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
}
#region VSTO generated code
}
答案 1 :(得分:0)
好的,Cindy让我朝着正确的方向前进。我使用的是WorkBookOpenHandler,而不是使用SheetActivateHandler。我不知道我可以用这种方式分配事件处理程序。我今天完全学会了这个。谢谢,辛迪:)
- 的ThisAddIn ---
public partial class ThisAddIn
{
Ribbon1 rbn;
string triggerName = "ECO";
#region StartUp
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
//detect the sheet name on workbook open event
rbn = Globals.Ribbons.Ribbon1;
this.Application.WorkbookOpen+= new Excel.AppEvents_WorkbookOpenEventHandler(Application_WorkbookOpen);
}
#endregion
#region Enable Ribbon Buttons
void Application_WorkbookOpen(object Sh)
{
Excel.Worksheet ws = (Excel.Worksheet)Globals.ThisAddIn.Application.ActiveSheet;
if (ws.Name == triggerName)
{
rbn.btn_ECOnumber.Enabled = false;
}
}
#endregion
--- Shutdown和VSTO在这里生成代码-----