C#进行Visio二次开发之管理下拉列表
每个Shape有很多属性,这里我是指自定义属性,每个属性都对应一种类型,就像我们在SqlServer创建一个字段的时候,需要指定其类型一样。Visio的属性类型有以下几种:
| 值 | 说明 | 自动常量 | 
| 0 | 字符串。此为默认值。 | visPropTypeString | 
| 1 | 固定列表。在“形状数据”对话框的下拉组合框中显示列表项。在 Format 单元格中指定列表项。用户只能从该列表中选择一项。 | visPropTypeListFix | 
| 2 | 数字。包括日期、时间、持续时间和货币值,以及标量、尺寸和角度。在 Format 单元格中指定格式图片。 | visPropTypeNumber | 
| 3 | 布尔值。显示 FALSE 和 TRUE 项,这两项正是用户可以从“形状数据”对话框中的下拉列表框选择的项。 | visPropTypeBool | 
| 4 | 变量列表。在“形状数据”对话框的下拉组合框中显示列表项。在 Format 单元格中指定列表项。用户可以选择列表项或在 Format 单元格中输入添加到当前列表中的新项。 | visPropTypeListVar | 
| 5 | 日期或时间值。显示日、月和年,或者秒、分钟和小时,或者日期和时间的组合值。在 Format 单元格中指定格式图片。 | visPropTypeDate | 
| 6 | 持续时间值。显示已经过去的时间。在 Format 单元格中指定格式图片。 | visPropTypeDuration | 
| 7 | 货币值。使用系统的当前“区域设置”。在 Format 单元格中指定格式图片。 | 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 = "专用;公用"
targetShape.get_CellsU("Prop." + source.Name + ".Format").FormulaU = "专用;公用"对于可变列表,我们就不希望把内容写死,否则妄为其名。如“生产厂商”属性,我们就希望它能够随着我们的数据库内容的变化而变化,那么如何实现呢?
首先,我们在数据库中创建两个表,一个表命名为DropdownListField,用来放置下拉列表的字段;一个表命名为DropdownListValue,用来放置可变列表的选项值。 
  
接着,我们在添加或者修改模具属性的时候,对每个设备的字段,为可变列表类型visPropTypeListVar,而没有加入列表字段表DropdownListField的,添加到数据库。这样就相当于在数据库中注册了该字段为可变列表,可以给它赋值了(下面介绍)。
然后,就是给可变列表赋值的步骤了,我们从数据库中找出相关的可变列表字段,给它添加或者删除相关的列表项就可以了,如下图所示。
最后,我们需要查看某个设备的时候,把它的下拉列表属性值更新显示即可(注意:上个步骤只是修改了数据库的列表值,而没有改变图纸的)。
由于我们查看图纸设备的时候,我们一定是选定了某个设备,那么我们在选定操作里面(响应Visio DrawingControl控件的SelectionChanged事件)更新图纸设备的列表字段就可以了,更新下拉列表的操作其实就是遍历所有的属性,对是可变列表的属性修改其列表值即可。
 if (VisWindow.Selection.Count > 0)
           if (VisWindow.Selection.Count > 0) {
            { Shape shapeSelected = VisWindow.Selection.get_Item16(1);
                Shape shapeSelected = VisWindow.Selection.get_Item16(1); //只更新选定的第一个设备的下拉列表,这样速度不会很慢
                //只更新选定的第一个设备的下拉列表,这样速度不会很慢 dropdownBLL.UpdateDropdownListValue(shapeSelected);
                dropdownBLL.UpdateDropdownListValue(shapeSelected); }
            }
 /// <summary>
        /// <summary> /// 更新Shape下拉列表的值
        /// 更新Shape下拉列表的值 /// </summary>
        /// </summary> public void UpdateDropdownListValue(Visio.Shape targetShape)
        public void UpdateDropdownListValue(Visio.Shape targetShape) {
        { string fieldId = string.Empty;
            string fieldId = string.Empty; string strFormatVlaue = string.Empty;
            string strFormatVlaue = string.Empty; List<StencilPropertyInfo> properties= propertyVOL.GetPropertyCollection(targetShape);
            List<StencilPropertyInfo> properties= propertyVOL.GetPropertyCollection(targetShape);
 foreach (StencilPropertyInfo entity in properties)
            foreach (StencilPropertyInfo entity in properties) {
            { if (entity.PropType == PropType.visPropTypeListVar)
                if (entity.PropType == PropType.visPropTypeListVar) {
                { strFormatVlaue = dropdownDAL.GetDrpFieldVlaue(entity.DeviceName, entity.Name);
                    strFormatVlaue = dropdownDAL.GetDrpFieldVlaue(entity.DeviceName, entity.Name); if (!string.IsNullOrEmpty(strFormatVlaue))
                    if (!string.IsNullOrEmpty(strFormatVlaue)) {
                    { targetShape.get_CellsU("Prop." + entity.Name +".Format").FormulaU =
                        targetShape.get_CellsU("Prop." + entity.Name +".Format").FormulaU = VisioUtility.StringToFormulaForString(strFormatVlaue);
                            VisioUtility.StringToFormulaForString(strFormatVlaue); }
                    } }
                } }
            } }
        }
我们看到最后的结果如下
 
 专注于代码生成工具、.Net/Python 框架架构及软件开发,以及各种Vue.js的前端技术应用。著有Winform开发框架/混合式开发框架、微信开发框架、Bootstrap开发框架、ABP开发框架、SqlSugar开发框架、Python开发框架等框架产品。
    
     专注于代码生成工具、.Net/Python 框架架构及软件开发,以及各种Vue.js的前端技术应用。著有Winform开发框架/混合式开发框架、微信开发框架、Bootstrap开发框架、ABP开发框架、SqlSugar开发框架、Python开发框架等框架产品。
     转载请注明出处:撰写人:伍华聪 http://www.iqidi.com
 
                     
                    
                 
                    
                 
            
 
             
                
            
         
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号