通过ThisAddIn StartUp的Excel VSTO访问表名称

时间:2018-01-09 20:26:34

标签: excel vsto ribbon

我被困住了,希望能在这里得到一些帮助。我有一个Excel VSTO加载项,其中包含各种控件的功能区。除非具有特定名称的工作表处于活动状态,否则我希望禁用除一个控件之外的所有控件。这是如何完成的?到目前为止,我想出了如何将功能区按钮映射到ThisAddIn启动以使其保持活动状态,而其他按钮默认为禁用:

RibbonButton btx_newECO = Globals.Ribbons.Ribbon1.btn_ECOnumber;
btx_newECO.Enabled = true;

现在,当打开具有特定名称的工作表时,如何启用其他功能区按钮? `

2 个答案:

答案 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在这里生成代码-----