2012-04-25 42 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,

相关问题