程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> C#進行Visio二次開發之管理下拉列表

C#進行Visio二次開發之管理下拉列表

編輯:關於C#

每個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

本文著重介紹下兩種類型:visPropTypeListFixvisPropTypeListVar,分別為固定列表和可變列表,其實這兩種類型對應的.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);
                    }
                }
            }
        }

我們看到最後的結果如下

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved