C#进行Visio二次开发之管理下拉列表
每个
Shape
有很多属性,这里我是指自定义属性,每个属性都对应一种类型,就像我们在
SqlServer
创建一个字段的时候,需要指定其类型一样。
Visio
的属性类型有以下几种:
值 |
说明 |
自动常量 |
0 |
字符串。此为默认值。 |
visPropTypeString |
1 |
固定列表。在 |
visPropTypeListFix |
2 |
数字。包括日期、时间、持续时间和货币值,以及标量、尺寸和角度。在 |
visPropTypeNumber |
3 |
布尔值。显示 |
visPropTypeBool |
4 |
变量列表。在 |
visPropTypeListVar |
5 |
日期或时间值。显示日、月和年,或者秒、分钟和小时,或者日期和时间的组合值。在 |
visPropTypeDate |
6 |
持续时间值。显示已经过去的时间。在 |
visPropTypeDuration |
7 |
货币值。使用系统的当前 |
visPropTypeCurrency |
本文着重介绍下两种类型:
visPropTypeListFix
和
visPropTypeListVar
,分别为固定列表和可变列表,其实这两种类型对应的
.NET
编程控件模型就是
ComboBox
,这个控件有个属性
DropDownStyle
,可以指定为
DropDownList
和
DropDown
这两种类型,本质上
visPropTypeListFix
对应
DropDownList
类型(只能选择列表的值),
visPropTypeListVar
对应
DropDown
类型(除了可选列表值,还可以输入新的值)。
Visio
的这两种列表的值,都是通过对应的
ShapeSheet
行中的
Format
的值来展示的,如有一个列表的
Format
的值为“
专用
;
公用
”,那么就有两项可以选择,如下图所示。
那我们在
Visio
的二次开发程序中如何管理这些下拉列表的呢?
对于固定列表,我们在添加或者修改自定义属性的时候,就给它固定的值那就可以了,很简单,如下面的代码:

targetShape.get_CellsU(
"
Prop.
"
+
source.Name
+
"
.Format
"
).FormulaU
=
"
专用;公用
"
对于可变列表,我们就不希望把内容写死,否则妄为其名。如“生产厂商”属性,我们就希望它能够随着我们的数据库内容的变化而变化,那么如何实现呢?
首先,我们在数据库中创建两个表,一个表命名为
DropdownListField
,用来放置下拉列表的字段;一个表命名为
DropdownListValue
,用来放置可变列表的选项值。
接着,我们在添加或者修改模具属性的时候,对每个设备的字段,为可变列表类型
visPropTypeListVar
,而
没有加入列表字段表
DropdownListField
的,添加到数据库。这样就相当于在数据库中注册了该字段为可变列表,可以给它赋值了(下面介绍)。
然后,就是给可变列表赋值的步骤了,我们从数据库中找出相关的可变列表字段,给它添加或者删除相关的列表项就可以了,如下图所示。
最后,我们需要查看某个设备的时候,把它的下拉列表属性值更新显示即可(注意:上个步骤只是修改了数据库的列表值,而没有改变图纸的)。
由于我们查看图纸设备的时候,我们一定是选定了某个设备,那么我们在选定操作里面(响应
Visio DrawingControl
控件的
SelectionChanged
事件)
更新图纸设备的列表字段就可以了,更新下拉列表的操作其实就是遍历所有的属性,对是可变列表的属性修改其列表值即可。

if
(VisWindow.Selection.Count
>
0
)

{

Shape shapeSelected
=
VisWindow.Selection.get_Item16(
1
);

//
只更新选定的第一个设备的下拉列表,这样速度不会很慢

dropdownBLL.UpdateDropdownListValue(shapeSelected);

}


///
<summary>

///
更新Shape下拉列表的值

///
</summary>

public
void
UpdateDropdownListValue(Visio.Shape targetShape)

{

string
fieldId
=
string
.Empty;

string
strFormatVlaue
=
string
.Empty;

List
<
StencilPropertyInfo
>
properties
=
propertyVOL.GetPropertyCollection(targetShape);


foreach
(StencilPropertyInfo entity
in
properties)

{

if
(entity.PropType
==
PropType.visPropTypeListVar)

{

strFormatVlaue
=
dropdownDAL.GetDrpFieldVlaue(entity.DeviceName, entity.Name);

if
(
!
string
.IsNullOrEmpty(strFormatVlaue))

{

targetShape.get_CellsU(
"
Prop.
"
+
entity.Name
+
"
.Format
"
).FormulaU
=

VisioUtility.StringToFormulaForString(strFormatVlaue);

}

}

}

}

我们看到最后的结果如下