2012-04-25 43 views
2

我有我從數據庫中抓取的數據,我想使用這些值來填充Visio圖上形狀的屬性。我打開我自己的模板,並在表單上顯示沒有問題的形狀。我的服務器圖標具有諸如「製造商」,「網絡」等自定義屬性當我打印出來的自定義屬性的每個的形狀,得到以下輸出:使用Visio自動化繪圖與C# - 無法設置自定義屬性

形狀=服務器標籤=製造商值= 0

等。這是完全正確的,因爲我還沒有設置任何值。當我去設置值時,使用Visio 2003 SDK(SettingACustomProperty.cs)中的代碼,我得到一個錯誤提示「此形狀沒有製造商的通用名稱的自定義屬性」 - 但仍然清晰地打印出定製屬性顯示它的確如此(一旦在Visio中繪製了形狀,就查看shapeSheet)。我已經插入到如何調用SettingACustomProperty。有人可以幫我弄清楚我需要做什麼來將值插入到我的自定義屬性的形狀?

這裏是我如何調用代碼(用於測試目的,我已經插入字符串自己):

string keyword = "Manufacturer"; 
    string manuValue = "\"Dell\""; 

    string three = SettingACustomProperty.SetCustomPropertyFormula(visioStarShape, keyword, manuValue); 
+0

如果您可以提供指向展示此問題的小樣本文件的鏈接,它將會有所幫助。我嘗試了一些代碼來設置自定義屬性,一切正常,所以它可能是您的文檔或文檔中的模具特定的東西。 – saveenr 2012-04-26 00:36:23

+0

saveenr - 這是我正在嘗試,但這看起來好像我是參考標籤,而不是實際的通用名稱 - [code] – Kathy 2012-04-27 11:56:55

+0

@saveenr - 你可以發表你如何改變一個通用名稱的樣本形狀的屬性? – Kathy 2012-04-27 19:07:47

回答

2

Visio中的自定義屬性都可以被認爲是名三種不同的概念。

第一個是標籤。這是您通常在用戶界面中看到的內容,並存儲在形狀表的自定義屬性行中的標籤單元格中。標籤通常不用於以編程方式訪問定製屬性。

第二個是行名。這是在查看圖表中的自定義屬性行時將看到的名稱。它會出現在行中的其他單元之前,並以「Prop」作爲前綴。這是通過自定義使用自定義屬性行的Name property訪問的。

最終的行名稱是通用名稱。通用名稱的存在主要是爲了允許代碼按名稱查找特定的Visio對象,即使在對象已本地化後名稱已更改(即名稱已被翻譯)後也是如此。通用名稱可以使用自定義屬性行的NameU property進行訪問。要了解有關通用名稱的更多信息,請參見Using Universal Names and Syntax to Localize Your Visio Solutions

當您調用SetCustomPropertyFormula時,第二個參數必須是通用名稱。這是因爲內部SetCustomPropertyFormula使用get_CellsU,它使用該行的通用名稱查找自定義屬性單元。在調用SetCustomPropertyFormula時,我懷疑是使用標籤或行名稱,而不是通用名稱。

如果您正在使用標籤,則需要切換到使用通用名稱。

如果您使用該名稱,則不再匹配通用名稱。當您重命名行時,可能會發生這種情況。你可以找出通用名稱,然後在你的代碼中使用它。 VBA即時窗口通常是獲取行的NameU屬性的簡單方法。或者,您可以更新其實例化的形狀或主控,以將NameU屬性設置爲Name屬性,然後您將避免此混淆(直到您重命名該行)。

+0

這很有道理 - 我試圖設置通用名稱,但確實引用了標籤。 在打印行的通用名稱時,我注意到其中有相當多的名稱具有諸如「R23」,「G87」等名稱。有什麼方法可以在我的模板中進行更改嗎? – Kathy 2012-04-27 11:50:02

+0

您可以更新您用來將NameU設置爲名稱的模具中的主模板。如果您正在編輯主人請記住使用[Master.Open](http://msdn.microsoft.com/en-us/library/ff766060.aspx)和[Master.Close](http://msdn.microsoft.com /en-us/library/ff766772.aspx)。 – 2012-04-28 17:05:49

+0

有人有我能看到的示例代碼嗎?我已經使用NameU函數打印出通用名稱,然後嘗試使用這些名稱設置值,並且它仍然告訴我沒有該名稱的單元格......此外,如何通過Visio本身更新NameU屬性?我一遍又一遍地打開相同的模板,所以不要以可編程方式更改這些東西。 – Kathy 2012-04-30 17:15:11

1

凱西:你可以找到你需要使用

Debug.Print visioStarShape.Section(visSectionProp).Row(0).NameU 

添加名稱爲「道具」。在此名稱之前在代碼中使用它。

或者,用形狀來選擇,您可以通過單擊的開發工具箱

Show ShapeSheet button

你看到這樣的事情該按鈕顯示在ShapeSheet。查找自定義屬性部分,在那裏你看到的標籤和你的屬性的名稱:

enter image description here

然後,你用這個名字來指代性(這是你的關鍵字串)。

keyword = """Prop.CustProp1""" 

or.... 

keyword = "\"Prop.CustProp1"\" 

不過,你不需要SettingACustomProperty.cs文件,因爲你可以引用形狀的表中的所有細胞從VBA代碼。 您可以在其中獲取或設置公式。

看看這是否符合您的目的。這是我剛纔在Office Techcenter上發佈的一個答案:http://social.technet.microsoft.com/Forums/office/en-US/c837db4c-b90c-4500-b8ae-8d36efca44b6/can-i-apply-custom-property-sets-from-vba-in-visio-2003

由於我的系統是西班牙文,我已經通過猜測改變了模板和主人的名字。但是重要的方法是AddSection,AddNamedRow,特別是對於你的.Formula(FormulaForce是一樣的,但它在使用GUARD函數保護單元的情況下也可以工作)。

祝你好運。我愛上了Visio 2003中(我希望我的公司買了Visio 2010中,雖然):d

'Set the value for the property: vsoShape is an object referencing the shape 
vsoShape.Cells("Prop.CustProp1").FormulaU = """Hello""" 
vsoShape.Cells("Prop.CustProp2").FormulaU = 2556 

類型CustProp1的是字符串,而該CustProp2的是數量。

Regards,

相關問題