Excel开发学习笔记:界面交互与控件的布局
遇到一个数据处理自动化的问题,于是打算开发一个基于excel的小工具。在业余时间一边自学一边实践,抽空把一些知识写下来以备今后参考,因为走的是盲人摸象的野路子,幼稚与错误请多包涵。
开发环境基于VSTO,具体配置:visual studio 2010,VB .Net,excel 2007,文档级别的定制程序。
除了业务逻辑之外,比较耗时耗力的就是人机交互了。在编写excel定制程序的过程中,这次用到了以下几种交互方式:
- 通过excel工作表(worksheet)获取用户输入
- 通过按钮控件触发功能代码执行
- 通过TreeView控件显示内容摘要及导航
- 通过自定义的windows窗体提供交互
工作表的操作放到后面再说,讲一下按钮控件button和Treeview控件的布局。
放置控件的方法:
无非可视化放置和运行时代码加载两种。可视化放置比较直观,通过visual studio的toolbox工具栏拖动需要的控件到工作表上或者自定义的windows窗体上,然后可以在设计界面设置控件的各种参数,在程序启动时自 动加载。代码加载则需要去msdn上查找各种控件开放的API接口,然后写代码调用API,在程序运行时由这些代码完成加载和参数设置。
控件的布局:
常见的有以下几种位置可供选择,适用于不同情况。
- excel worksheet上
- 操作窗格action pane(文档级自定义程序专用)
- Ribbon UI功能区(也就是excel2007上方的"开始"、"插入"菜单的位置)
另外,我们还可以在弹出的自定义windows窗体在上布局各种控件。Office UI自定义的官方介绍点击打开链接:http://msdn.microsoft.com/zh-cn/library/bf08984t.aspx
个人觉得操作窗格是很好用的一个布局区域,它通常位于office界面的侧面,类似windows文件夹界面左侧的导航栏,优势是区域够大且不影响 excel工作表界面。很多文章提到自定义任务窗格custom task pane的用法,我迷糊了好久才明白这东西是给外接程序add-ins用的,对应文档级程序中的操作窗格action pane,显示效果差不多。
1、工作表worksheet
最简单粗暴而有效的布局方式,将工作表作为放置控件的容器,直接从控件工具栏中拖动想要的控件到指定的位置,然后双击控件就可切换到代码视图,在想要的事件中添加功能代码即可。而且因为控件的事件代码是和工作表代码一起的,访问工作表的内容特别方便,很贴心。
比如下面的代码响应某个按钮的点击,直接给按钮所在工作表的第二行第一列的单元格赋值,内容是当前工作表的名称。
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Cells(, ).value = Name
MsgBox(Name)
End Sub
这种控件布局方式的缺点主要是干扰了工作表界面的正常操作,与工作表随心所欲的多变特性不般配,而且显示效果比较丑陋。适合快速开发的小工具,简单有效地解决业务问题即可。我最早也是将按控件放置在工作表上,后来都移走了。
2、操作窗格action pane
操作窗格没法在设计界面编辑,无法向其中拖动控件,只能写代码来完成控件的加载和设置。但我们可以在工程中添加一个用户控件(user control)或者操作窗格控件(action pane control),这2个control控件的作用就是作为其他控件的容器,分别位于工程右键菜单的add-->new item-->windows forms和new item-->office下面。可以向他们上面拖动你想要的其他控件,根据喜好设置好界面后,只需要用代码把control控件加载到操作窗格即 可,所有的内容都会自动显示出来。
加载控件到操作窗格的代码如下(以工作薄workbook中加载为例):
Public Class ThisWorkbook
'在过程外部声明添加到工程的control控件,作为类变量
Public actionControl As New ActionsPaneControl1 Private Sub ThisWorkbook_Startup() Handles Me.Startup
'加载control控件到操作窗格,ActionsPane要通过工作簿workbook来引用
ActionsPane.Controls.Add(actionControl)
'设置操作窗格的显示位置为左侧,注意获取操作窗格与添加control控件的差别
Application.CommandBars("Task Pane").Position = Microsoft.Office.Core.MsoBarPosition.msoBarLeft
End Sub
End Class
如果在worksheet代码中添加控件到操作窗格,需要通过Globals.ThisWorkbook.ActionsPane来引用。
效果图:
3、Ribbon UI功能区
office2007 自带的功能入口所在的区域,几经调整我最终把功能按钮放在了ribbon功能区。可以通过工程右键菜单-->add-->new item-->office-->ribbon新增自定义Ribbon功能区(我选择了visual designer模版)。然后就可以在设计器界面往新增的自定义功能区上添加控件了。
修改控件的大小:
属性窗口-->controlSize,默认小号
修改控件的图标:
属性窗口-->OfficeImageId,可以通过名称关联Office自带的图标,省去了自己找图标的麻烦。比如输入FileOpen就会在运行时显示为平时常见的打开文件的图标。可以在微软官网http://www.microsoft.com/en-us/download/details.aspx?id=11675下载到所有office图标所对应的OfficeImageId,也就是2007 Office System Add-In: Icons Gallery。
修改功能区的位置:
属性窗口-->position-->PositionType,默认是放在最后面,在我机器上也就是在"开发工具"功能区的后面。还可以选择 “beforeOfficeId”和“afterOfficeId”,分别表示我们的功能区域希望放在哪个功能区的前面或后面,这时还需要输入这个功能区 的officeId或名称。可以在微软官网http://www.microsoft.com/en-us/download/details.aspx?id=6627下载到所有office自带控件的详细情况,也就是Office 2010 Help Files: Office Fluent User Interface Control Identifiers。
这个帮助文档的内容实在太多,可以通过control Type列筛选“tab”关键字,可以发现这些ribbon功能区的命名规则很简单,Tab+功能区英文名,明白这个规则后可以省去查找的工作,比如“开 始”和“插入”功能区在excel英文版中显示为“Home”和“Insert”,那么我们只需要在OfficeId栏中输入TabHome和 TabInsert即可。如果想把自定义功能区显示在最前面,只需要选择beforeOfficeId,然后输入TabHome即可。
另外,VS2010的Ribbon设计器有bug,照上面的方法在界面设置beforeOfficeId和TabHome属性之后,运行会报错“The type 'Microsoft.VisualStudio.Tools.Office.Ribbon.View.GenericRibbonView' has no property named 'Factory'.”。还好Msdn社区有帖子说这个事,链接在此点击打开链接。好像是说由于vs2010在后台自动生成的ribbon界面代码不正确,报错位于ribbon1.designer.vb中的InitializeComponent函数内(ribbon1为添加ribbon功能区时的代码名称),将错误的语句剪切到InitializeComponent 函数的调用之后即可,比如把“Me.Tab1.Position = Me.Factory.RibbonPosition.BeforeOfficeId("TabHome")”剪切到下图位置。在我的工程中,这个位置就在错误语句的上方不远。
<System.Diagnostics.DebuggerNonUserCode()> _
Public Sub New()
MyBase.New(Globals.Factory.GetRibbonFactory()) 'This call is required by the Component Designer.
InitializeComponent()
'移到这里
Me.Tab1.Position = Me.Factory.RibbonPosition.BeforeOfficeId("TabHome")
End Sub
效果图:
Excel开发学习笔记:界面交互与控件的布局的更多相关文章
- Excel开发学习笔记:文件选择控件、查找匹配项、单元格格式及数据有效性
一个自用的基于excel的小工具. , ), .Cells(, )) sysKpiRow.Interior.ColorIndex = ).value = , ) ...
- IOS开发学习笔记019-动态创建控件
动态创建控件 一.按钮 二.文本输入框 三.lable标签 注意: 只是简单的拖拽控件会毁了你,所以最好还是手动通过代码创建控件. 如果要通过代码生成按钮的话,可以在系统自带的函数viewDidLoa ...
- <WP8开发学习笔记>修改panorama全景控件的标题的大小
panorama(全景)控件非常具有WinPhone特色,但是那个巨大的标题许多时候会让人觉得违和.怎么修改它呢? 最开始想到的是加一个FontSize,结果毫无影响.╮(╯-╰)╭ <phon ...
- Excel开发学习笔记:新建文档级的excel解决方案
工作中遇到一个数据处理自动化的问题,于是打算开发一个基于excel的小工具.在业余时间一边自学一边实践,最近终于完成了雏形.抽空把一些知识写下来以备今后参考,因为走的是盲人摸象的野路子,幼稚与错误请多 ...
- Duilib学习笔记《03》— 控件使用
在前面已经对duilib有个一个基本的了解,并且创建了简单的空白窗体.这仅仅只是一个开始,如何去创建一个绚丽多彩的界面呢?这就需要一些控件元素(按钮.文本框.列表框等等)来完善. 一. Duilib控 ...
- Android Studio 学习笔记(三):简单控件及实例
控件.组件.插件概念区分 说到控件,就不得不区分一些概念. 控件(Control):编程中用到的部件 组件(Component):软件的组成部分 插件(plugin): 应用程序中已经预留接口的组件 ...
- android开发学习笔记系列(4)--android动态布局
前言 在做一个有关苏果APP的项目中,但是fuck的是,我完全使用相对布局之后及线性布局之后发现坑爹的事情了,屏幕不能适配,这是多大的痛,意味着,必须使用相应的代码实现动态布局!呵呵,不做项目不知道, ...
- 第六周学习笔记,vc各类控件的输入输出
6w学习笔记 vc控件的输入输出 单选按钮 当单击 RadioButton 控件时,其 Checked 属性设置为 true,并且调用 Click 事件处理程序.当 Checked 属性的值更改时,将 ...
- c#学习笔记之使用 TableLayoutPanel 控件设置窗体布局
使用 TableLayoutPanel 控件设置窗体布局 在 Visual Studio IDE 左侧,找到“工具箱”选项卡. 选择“工具箱”选项卡,随即将显示工具箱.(或者,在菜单栏上,依次选择“视 ...
随机推荐
- 在Java项目中部署使用Memcached[转]
在项目中使用到Memcached主要的目的是,通过缓存数据库查询结果,减少数据库访问次数,从而提高动态.数据库驱动网站的速度.提高可扩展性.Memcached是一个高性能的分布式内存对象缓存系统,基于 ...
- 【P2405】方格取数问题加强版(费用流)
考虑如何建图.还是老样子先拆点,然后把每两个点之间连接两条边,一条流量为1,费用为-点权,处理是否走这个点.一条流量无限,没有费用,因为哪怕一个点选过了,它的地方还是可以重复走过去的. 然后把经由一个 ...
- input ajax自动补全
页面 <div class="manage-Car-add-info-sn"> <p style="width:25%; height:70%;floa ...
- 错误 1 类型“System.Web.Mvc.ModelClientValidationRule”同时存在于“c:\Progra型“System.Web.Mvc.ModelClientValidationRule”同时存在
解决方案: step1:首先关闭你应用程序方案,在你保存项目的文件夹下找到ProjectName.csproj ProjectName是你实际的应用程序名称. step2:用文字编辑器打开你找到它找 ...
- Spring中AOP的初窥和入门小案例
AOP:面向切面编程 AOP的主要作用:是为了程序员更好的关注"业务",专心"做事" 加上双引号的意思:所谓业务,是指他的核心,各行业中需要处理的核心事务,核心 ...
- 双十字路口交通仿真程序(VS2010+MFC)
这个程序是我上研二上学期时下一届师弟师妹们的面向对象课程大作业,当时我正好看过两三本 C++ 书籍,虽然忙着项目,但还是忙里偷闲检验了下自己.从设计到实现,耗时一周左右,完成于 2013 年年底. 虽 ...
- WCF实现REST服务
REST 表述性状态转移(Representational State Transfer,REST),不是一种标准,而是一种软件架构风格. 基于REST的服务与基于SOAP的服务相比,性能.效率和易用 ...
- ItelliJ IDEA下载及获取注册码详解
Idea安装很简单: 官网地址下载:https://www.jetbrains.com/idea/ 注册码获取:http://idea.lanyus.com/ 进入此网址,点击“获得注册码”复制使 ...
- 利用wtl的CDialogResize自动调整atl ActiveX控件布局
前言 利用atl 开发activex控件时,如果使用atl复合控件时,acitvex控件上的界面元素不会自动改变大小,如果自己在OnSize中处理每个子控件的布局是一件非常麻烦的事,我们可以借助wtl ...
- brew安装php和扩展
brew install homebrew/php/php56 --with-apache 报错: checking if the location of ZLIB install directory ...