在工作中有一个需求,需要添加工作区选项卡,Excel中CustomTaskPanes面板很适合这样的场景,而非集中处理在Excel的Ribbon面板中,毕竟在大型项目中表现层已经过于复杂了。首先写一个显示Panes的方法。

var sr = new OtherShouldReceiveUserControl(Wb, Wb.Application);
var dpi = sr.dpiValue;
sr.Name = "OtherShouldReceiveUserControl";
var customTaskPane = Globals.ThisAddIn.CustomTaskPanes.Add(sr, "快速导航");
customTaskPane.DockPosition = MsoCTPDockPosition.msoCTPDockPositionFloating;
customTaskPane.DockPositionRestrict = MsoCTPDockPositionRestrict
.msoCTPDockPositionRestrictNoChange;
customTaskPane.Visible = true;

而这个方法我们会在worksheet active中触发。

app = Globals.ThisAddIn.Application;
app.SheetActivate += App_SheetActivate;
  private void App_SheetActivate(object Sh)
{
CommonUtils.CallShowNavicatButton(CurWorkbook, curWorksheet.Name);
}

在SheetActive中调用方法,不过有一个问题,每次Active处罚之后都会Add  OtherShouldReceiveUserControl 用户控件,它会出现用户控件重复添加的情况,所以你需要做一定的冗余处理。如何处理呢?

Worksheet worksheet = Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet;
var EnableNavicat = GetEnableNavicat();
if (EnableNavicat == "false")
{ return; }
if (Wb.Application.Visible)
{
#region 删除导航,激活其他excel必须用目前方法
int i = -1;
int deleteIndex = -1;
foreach (var panel in Globals.ThisAddIn.CustomTaskPanes)
{
i++;
try
{
if (panel != null && (panel.Title == "快速导航")
{
panel.Visible = false;
deleteIndex = i; break;
}
}
catch { }
}
if (deleteIndex >= 0)
{
//移除导航
try
{
Globals.ThisAddIn.CustomTaskPanes.RemoveAt(deleteIndex);
}
catch { }
}

首先遍历 Globals.ThisAddIn.CustomTaskPanes 中的所有panel,如果Title是我们刚才添加的,或许你可以使用Tag来判断,这由你而定。随后通过 RemoveAt 方法来进行Delete操作。值得注意还有一个参数需要说说, MsoCTPDockPosition 改变Panel的 DockPosition 排列方式。一般使用Float即可。

//
// 摘要:
// Specifies the docking behavior of the custom task pane.
public enum MsoCTPDockPosition
{
//
// 摘要:
// Dock the task pane on the left side of the document window.
msoCTPDockPositionLeft = 0,
//
// 摘要:
// Dock the task pane at the top of the document window.
msoCTPDockPositionTop = 1,
//
// 摘要:
// Dock the task pane on the right side of the document window.
msoCTPDockPositionRight = 2,
//
// 摘要:
// Dock the task pane at the bottom of the document window.
msoCTPDockPositionBottom = 3,
//
// 摘要:
// Don't dock the task pane.
msoCTPDockPositionFloating = 4
}

  在此之前,我要创建一个Ribbon,百思不得其解的是Vsto是否只对应一个Ribbon面板,或者说是可以绑定多个,我多次试验后,发现是vsto项目确实对应一个Ribbon,当你创建了Vsto项目你会发现你的项目中还没有Ribbon,你需要手动创建。如图下。

  你以为这样你的项目中就生效了吗,你还需要将 Controlid 改为Custom,如果你想要第二个TabRibbon,你不需要在创建一个Ribbon,如果你创建了2个,那将都不显示,所有只能再创建一个Tab绑定一个 Controlid 。此时此刻,如图所示,已经达到了我们的效果。

感谢您阅读本篇文章,祝您工作顺利。

C#/Vsto中CustomTaskPanes和Ribbon的使用方法的更多相关文章

  1. VSTO中Word的Range复制方式

    VSTO中Word的Range复制方式 前言 VSTO是一套用于创建自定义Office应用程序的Visual Studio工具包,通过Interop提供的增强Office对象,可以对Word文档进行编 ...

  2. VSTO中Word转换Range为Image的方法

    VSTO中Word转换Range为Image的方法 前言 VSTO是一套用于创建自定义Office应用程序的Visual Studio工具包,通过Interop提供的增强Office对象,可以对Wor ...

  3. VSTO中Word的查找方式

    VSTO中Word的查找方式 前言 使用C#在VSTO开发Word插件的过程,经常需要对文档中的内容进行查找和替换.在Word中进行文本的查找替换,和一般对纯文本的查找替换却不太一样.因为Word文档 ...

  4. Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么?

    导读 今天和大家聊一聊在Spring Cloud微服务框架实践中,比较核心但是又很容易把人搞得稀里糊涂的一个问题,那就是在Spring Cloud中Hystrix.Ribbon以及Feign它们三者之 ...

  5. 浅谈Excel开发:九 Excel 开发中遇到的常见问题及解决方法

    Excel开发过程中有时候会遇到各种奇怪的问题,下面就列出一些本人在开发中遇到的一些比较典型的问题,并给出了解决方法,希望对大家有所帮助. 一 插件调试不了以及错误导致崩溃的问题 在开发机器上,有时可 ...

  6. MSCRM 2011中过滤化查询的实现方法和禁用选择视图

    MS CRM 2011中过滤化查询的实现方法 使用过滤化查询,可以实现根据表单上的其他信息作为搜索条件,限制Lookup查找框中的搜索结果数量的目的. 在讲解具体的实现方法之前,先设定一个应用场景: ...

  7. C#中实现并发的几种方法的性能测试

    C#中实现并发的几种方法的性能测试 0x00 起因 去年写的一个程序因为需要在局域网发送消息支持一些命令和简单数据的传输,所以写了一个C/S的通信模块.当时的做法很简单,服务端等待链接,有用户接入后开 ...

  8. .Net中的AOP系列之《方法执行前后——边界切面》

    返回<.Net中的AOP>系列学习总目录 本篇目录 边界切面 PostSharp方法边界 方法边界 VS 方法拦截 ASP.NET HttpModule边界 真实案例--检查是否为移动端用 ...

  9. VS2012中丢失ArcGIS模板的解决方法

    VS2012中丢失ArcGIS模板的解决方法 由于ArcGIS10.0(for .NET)默认是用VS2010作为开发工具的,所以在先安装VS2012后装ArcGIS10.0 桌面版及ArcObjec ...

随机推荐

  1. web虚拟主机、日志分割以及日志分析

    目录 一.构建虚拟web主机 1.1 概述 1.2 支持的虚拟主机类型 1.3 部署虚拟主机步骤 1.3.1 基于域名的虚拟主机 (1)为虚拟主机提供域名解析 (2)为虚拟主机准备网页文档 (3)添加 ...

  2. ybt的坑

    emmmm ybt 字符串处理 例2题解错了 AC自动机板子错了(据说) 另外字符串处理的题解写的我一脸懵逼 网站上eeeee 点击查看E. 1.排队接水 #include <iostream& ...

  3. 北京太速科技-6U VPX 6槽 Full Mesh结构背板机箱

    一.产品概述 Ori6UVPX6SlotFullMesh264背板机箱 为 6U VPX 6槽 Full Mesh结构,用于实现PCIE.RapidIO IO 4X Full Mesh 高速数据互联, ...

  4. Spring Boot自动配置SpringMVC(二)

    Spring Boot自动配置SpringMVC(一) - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)讲述了关于DispatcherServlet注册到诸如tomcat容器中的自动配置过 ...

  5. 定制Centos7.9镜像

    Ps:因为工作内容:有一部份是需要重装系统:系统版本镜像为centos7.9.可每次装完都需要下载一些基础包:最近因为设备过多:网卡名称太乱:导致做后续配置太繁琐:不规整:索性自己定制个系统: 搭建基 ...

  6. Java NIO Selector 的使用

    之前的文章已经把 Java 中 NIO 的 Buffer.Channel 讲解完了,不太了解的可以先回过头去看看.这篇文章我们就来聊聊 Selector -- 选择器. 首先 Selector 是用来 ...

  7. 干掉Session?这个跨域认证解决方案真的优雅!

    用户登录认证是 Web 应用中非常常见的一个业务,一般的流程是这样的: 客户端向服务器端发送用户名和密码 服务器端验证通过后,在当前会话(session)中保存相关数据,比如说登录时间.登录 IP 等 ...

  8. 彻底明白Linux硬链接和软链接

    [硬连接] 在Linux的文件系统中,保存在磁盘分区中的实际文件不管是什么类型系统都给它分配一个编号,称为索引节点号(Inode Index),这个索引节点用来标识这个文件,即这个索引节点就代表了这个 ...

  9. 使用Helm安装harbor

    使用nfs共享存储搭建的pvc(此次都放在一个vpc下): harbor使用nodePort方式部署,不使用ssl: 准备工作: 准备好harbor用的pvc: 安装好helm,添加好可用源: 因为使 ...

  10. 支持 dd 命令的简单的 GUI 实用程序

    Kindd-支持 dd 命令的简单的 GUI 实用程序 "Kindd",一个属于dd 命令的图形化前端.它是自由开源的.用 Qt Quick 所写的工具.总的来说,这个工具对那些对 ...