Excel VSTO 插件 showing/hiding 任务窗格
Excel VSTO Addin showing/hiding taskpane
我在这里做教程。空白 excel 页面
一切正常
https://msdn.microsoft.com/en-us/library/bb608590(v=vs.120).aspx
当我加载 excel sheet 某人给我并点击 toggleButton1 以显示我得到的窗格时
{"The taskpane has been deleted or is otherwise no longer valid."}
上线
private void toggleButton1_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.TaskPane.Visible = ((RibbonToggleButton)sender).Checked;
}
指向该任务窗格的指针是否以某种方式消失了?
Microsoft.Office.Tools.CustomTaskPane PartPhotoTaskPane;
Globals.ThisAddIn.Application.WindowActivate += Application_WindowActivate;
void Application_WindowActivate(Excel.Workbook Wb, Excel.Window Wn)
{
if (PartPhotoTaskPane != null)
{
PartPhotoTaskPane.Dispose();
InitalizePartPhotoViewerTaskPane(EPPF);
}
else
{
InitalizePartPhotoViewerTaskPane(EPPF);
}
}
/// <summary>
/// Start up the part photo viewer task pane
/// </summary>
private void InitalizePartPhotoViewerTaskPane(ExcelPartPhotoFunctions _EPPF)
{
//intialize the part search
try
{
PartPhotoTaskPane = Globals.ThisAddIn.CustomTaskPanes.Add(new PartPhotoSearchPane(_EPPF), "Part Information", Globals.ThisAddIn.Application.ActiveWindow);
PartPhotoTaskPane.Visible = Properties.Settings.Default.InfoPaneOpenStatus;
PartPhotoTaskPane.Width = 260;
}
catch (Exception e)
{
MessageBox.Show("Error starting Part Info Toolbar:" + Environment.NewLine +
e.Message + Environment.NewLine + e.StackTrace, "Error!", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
尝试 1:
点击事件仍然出错。我猜这与我需要在 class 之间共享该窗格有关吗?
private void toggleButton1_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.TaskPane.Visible = ((RibbonToggleButton)sender).Checked;
}
private void ExcelEvents_WorkbookActivate(Excel.Workbook wb)
{
var taskPane = (customTaskPanes.Where(kvp => kvp.Key.Target == wb).Select(kvp => kvp.Value).FirstOrDefault());
if (taskPane == null)
{
UcCenlarInvest control = new UcCenlarInvest();
taskPane = this.CustomTaskPanes.Add(control, "My pane for workbook " + wb.Name);
customTaskPanes[new WeakReference(wb)] = taskPane;
}
}
尝试 2:
所以现在功能区 class 可以获取 TaskPane 但我仍然遇到相同的错误。添加了这个:
private CustomTaskPane taskPane;
public CustomTaskPane TaskPane
{
get
{
//return (customTaskPanes.Where(kvp => kvp.Key.Target == wb).Select(kvp => kvp.Value).FirstOrDefault());
return pane;
}
set
{
taskPane = value;
}
}
.....
TaskPane = (customTaskPanes.Where(kvp => kvp.Key.Target == wb).Select(kvp => kvp.Value).FirstOrDefault());
Excel 2016 是单文档界面(SDI),Excel 的单个实例中的每个工作簿都包含自己的功能区UI。 more information
如果您打开一个新的工作簿,会出现一个新的功能区,但是指向任务窗格的指针会丢失。您应该实施 WorkbookActivate 事件并添加一个新的任务窗格(如果尚不存在任务窗格)。您还应该保留指向自定义任务窗格的静态指针列表。
查看此解决方案:CustomTaskPane in Excel doesn't appear in new Workbooks
您也可以通过检查任务窗格控件的 IsDisposed
属性 来解决此问题,例如
if (taskPane.CustomTaskPane?.Control.IsDisposed == false)
{
taskPane.CustomTaskPane.Visible = false;
}
我在这里做教程。空白 excel 页面
一切正常https://msdn.microsoft.com/en-us/library/bb608590(v=vs.120).aspx
当我加载 excel sheet 某人给我并点击 toggleButton1 以显示我得到的窗格时
{"The taskpane has been deleted or is otherwise no longer valid."}
上线
private void toggleButton1_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.TaskPane.Visible = ((RibbonToggleButton)sender).Checked;
}
指向该任务窗格的指针是否以某种方式消失了?
Microsoft.Office.Tools.CustomTaskPane PartPhotoTaskPane;
Globals.ThisAddIn.Application.WindowActivate += Application_WindowActivate;
void Application_WindowActivate(Excel.Workbook Wb, Excel.Window Wn)
{
if (PartPhotoTaskPane != null)
{
PartPhotoTaskPane.Dispose();
InitalizePartPhotoViewerTaskPane(EPPF);
}
else
{
InitalizePartPhotoViewerTaskPane(EPPF);
}
}
/// <summary>
/// Start up the part photo viewer task pane
/// </summary>
private void InitalizePartPhotoViewerTaskPane(ExcelPartPhotoFunctions _EPPF)
{
//intialize the part search
try
{
PartPhotoTaskPane = Globals.ThisAddIn.CustomTaskPanes.Add(new PartPhotoSearchPane(_EPPF), "Part Information", Globals.ThisAddIn.Application.ActiveWindow);
PartPhotoTaskPane.Visible = Properties.Settings.Default.InfoPaneOpenStatus;
PartPhotoTaskPane.Width = 260;
}
catch (Exception e)
{
MessageBox.Show("Error starting Part Info Toolbar:" + Environment.NewLine +
e.Message + Environment.NewLine + e.StackTrace, "Error!", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
尝试 1:
点击事件仍然出错。我猜这与我需要在 class 之间共享该窗格有关吗?
private void toggleButton1_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.TaskPane.Visible = ((RibbonToggleButton)sender).Checked;
}
private void ExcelEvents_WorkbookActivate(Excel.Workbook wb)
{
var taskPane = (customTaskPanes.Where(kvp => kvp.Key.Target == wb).Select(kvp => kvp.Value).FirstOrDefault());
if (taskPane == null)
{
UcCenlarInvest control = new UcCenlarInvest();
taskPane = this.CustomTaskPanes.Add(control, "My pane for workbook " + wb.Name);
customTaskPanes[new WeakReference(wb)] = taskPane;
}
}
尝试 2:
所以现在功能区 class 可以获取 TaskPane 但我仍然遇到相同的错误。添加了这个:
private CustomTaskPane taskPane;
public CustomTaskPane TaskPane
{
get
{
//return (customTaskPanes.Where(kvp => kvp.Key.Target == wb).Select(kvp => kvp.Value).FirstOrDefault());
return pane;
}
set
{
taskPane = value;
}
}
.....
TaskPane = (customTaskPanes.Where(kvp => kvp.Key.Target == wb).Select(kvp => kvp.Value).FirstOrDefault());
Excel 2016 是单文档界面(SDI),Excel 的单个实例中的每个工作簿都包含自己的功能区UI。 more information
如果您打开一个新的工作簿,会出现一个新的功能区,但是指向任务窗格的指针会丢失。您应该实施 WorkbookActivate 事件并添加一个新的任务窗格(如果尚不存在任务窗格)。您还应该保留指向自定义任务窗格的静态指针列表。
查看此解决方案:CustomTaskPane in Excel doesn't appear in new Workbooks
您也可以通过检查任务窗格控件的 IsDisposed
属性 来解决此问题,例如
if (taskPane.CustomTaskPane?.Control.IsDisposed == false)
{
taskPane.CustomTaskPane.Visible = false;
}