Excel VSTO 通过 ThisAddIn StartUp 访问 sheet 名称

Excel VSTO access sheet name through ThisAddIn StartUp

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

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

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

我的回答假设功能区是在设计时使用功能区设计器定义的。从您的代码看来,这就是您正在做的事情(而不是使用 Ribbon XML)。

请注意,在功能区 class 的 class 级别声明了一个字段,并在 ThisAddin_Startup 事件中填充,以便在 [=] 期间随时使用加载项的 19=]。

此外,应用程序的 SheetActivate 事件被实例化。每次激活不同的工作表时都会触发。如果选中工作表的名称。如果是正确的,则启用功能区按钮;否则该按钮将被禁用。

我在功能区设计器属性中将按钮设置为默认禁用。但您也可以在功能区 classes 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
}

好的,Cindy 让我朝着正确的方向前进。我没有使用 SheetActivateHandler,而是使用了 WorkBookOpenHandler。我不知道我可以用这种方式分配事件处理程序。我今天完全学会了这一点。谢谢,辛迪 :)

--这个插件---

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

---关机和VSTO在这里生成代码-----