【问题标题】:using visio to automate drawing diagram with c# - can't set custom properties使用 visio 使用 c# 自动绘制图表 - 无法设置自定义属性
【发布时间】:2012-04-25 17:09:06
【问题描述】:

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

形状 = 服务器标签 = 制造商值 = 0

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

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

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

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

【问题讨论】:

  • 如果您可以提供一个指向显示此问题的小示例文件的链接,将会有所帮助。我尝试了一些代码来设置自定义属性并且一切正常,因此它可能与您的文档或文档中的模板有关。
  • saveenr - 这是我正在尝试的,但这看起来好像我在引用标签,而不是实际的通用名称 - [代码]
  • @saveenr - 您能否发布一个示例,说明如何更改形状自定义属性的通用名称?

标签: c# visio


【解决方案1】:

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

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

第二个是行名。这是您在查看 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 属性,然后您将避免这种混淆(直到您重命名该行)。

【讨论】:

  • 这是有道理的——我试图设置通用名称,但实际上引用了标签。在打印行的通用名称时,我注意到其中相当一部分具有诸如“R23”、“G87”之类的名称。有什么办法可以在我的模板中更改它?
  • 您可以更新您正在使用的模板中的母版,以将 NameU 设置为等于 Name。如果你是编辑大师记得使用Master.OpenMaster.Close
  • 有人有我可以看到的示例代码吗?我已经使用 NameU 函数打印出通用名称,然后尝试使用这些名称设置值,它仍然告诉我没有具有该名称的单元格......另外,如何通过 Visio 本身更新 NameU 属性?我一遍又一遍地打开同一个模板,所以如果可能的话,我不想以编程方式改变这些东西。
【解决方案2】:

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

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

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

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

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

然后,您使用此名称来引用属性(即您的关键字字符串)。

keyword = """Prop.CustProp1"""

or....

keyword = "\"Prop.CustProp1"\"

不过,您不需要 SettingACustomProperty.cs 文件,因为您可以从 VBA 代码中引用形状工作表中的所有单元格。 您可以在其中获取或设置公式。

看看这是否符合您的目的。这是我刚刚在 Office 技术中心发布的答案: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 的类型是数字。

问候,

【讨论】:

    猜你喜欢
    • 2013-01-25
    • 2021-12-17
    • 1970-01-01
    • 2013-09-28
    • 2016-02-24
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多