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在这里生成代码-----
我被困住了,希望能在这里得到一些帮助。我有一个 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在这里生成代码-----