使用visio使用c#自动绘制图表 - 无法设置自定义属性

时间:2012-04-25 17:09:06

标签: c# visio

我有从数据库中获取的数据,我想使用这些值来填充visio图上的形状属性。我打开自己的模板,在工作表上显示形状没有问题。我的服务器图标具有自定义属性,例如“制造商”,“网络”等。当我打印出每个形状的自定义属性时,我得到以下输出:

Shape =服务器标签=制造商值= 0

等。这一切都是正确的,因为我还没有设置任何值。当我使用Visio 2003 SDK(SettingACustomProperty.cs)中的代码设置值时,出现“此形状没有通用名称为制造商的自定义属性”的错误 - 但是清楚地打印出自定义属性显示它(就像在Visio中绘制形状时查看shapeSheet一样)。我插入到如何调用SettingACustomProperty。有人可以帮我弄清楚我需要做什么才能将值插入到形状上的自定义属性中吗?

以下是我调用代码的方法(出于测试目的,我自己插入了字符串):

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

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

2 个答案:

答案 0 :(得分:2)

Visio自定义属性有三个不同的概念,可以视为名称。

第一个是标签。这是您通常在用户界面中看到的内容,并存储在shapesheet中自定义属性行的标签单元格中。标签通常不用于以编程方式访问自定义属性。

第二个是行名称。这是在查看结构图中的自定义属性行时将看到的名称。它将出现在行中的其他单元格之前,并以“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属性,然后您将避免这种混淆(直到您重命名该行)。

答案 1 :(得分:1)

Kathy:你可以找到你需要使用的名字

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

添加“道具”。在此名称之前,在您的代码中使用它。

或者,在选择了形状的情况下,您可以通过单击开发人员工具箱中的此按钮来显示ShapeSheet

Show ShapeSheet button

你看到这样的事情。查找“自定义属性”部分,您可以在其中看到标签和属性名称:

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 one(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的类型是数字。

此致