如何正确阅读 Visio Shape 的文本

How to read Visio Shape's text properly

我正在尝试将 VBA 代码转移到 C#,以便我制作的表单应用程序是独立的。我在尝试从形状内(在组中)的形状中获取文本时遇到问题。这是 VBA 中的一个完美无缺的示例。

Dim text as String
text = groupShape.shapes.item("rectangle").text

这是 return 正确的值。 在 C# 中,我使用 microsoft.office.interop.visio.dll 引用。我已经能够很好地读取形状名称,所以我知道我的应用程序和文档对象工作正常。在 C# 中,上面的代码如下所示:

var text = "";
text = Doc.Shapes.ItemU("groupShape").Shapes.ItemU("rectangle").text

这不是 return 正确的值。它说它将 return "Object" 所以我相信它不是 return 一个字符串而是一个对象。

为了return文本,我该怎么做才能解决这个问题?谢谢!

编辑: 这是我正在编写的实际代码。 vba 和 c#

VBA:

Dim tempShape As Shape

Set tempShape = ActiveDocument.Pages(pageName).Shapes.Item("MainTable")

txtJobName.value = tempShape.Shapes.Item("textJobName").Text

c#

IVisio.Shape tempShape = Doc.Pages[Loaded_Page.Name].Shapes.ItemU["MainTable"];

 Txt_JobName.Text = tempShape.Shapes.ItemU["textJobName"].Characters.Text;

另一项编辑: 我还尝试通过引用文本所在的单元格来进入形状数据属性,但仍然没有成功。

Txt_JobName.Text = tempShape.Shapes.ItemU["textJobName"].CellsSRC[8, 0, 0].ResultStr[0];

我对 Visio 类型库不是很熟悉,但是:

groupShape.shapes.item("rectangle")

正在返回一个 Shape 对象。抓住那个对象引用而不是用另一个点丢弃它。 VBA 在这里 "helpful",并且很高兴让您编写只会在 运行 时解决的后期绑定调用 - C# 只会对 dynamic 关键字如此宽容,并且您通常不想针对 dynamic 进行编码 - 您希望使用强类型:

Dim rectangle As Shape
Set rectangle = groupShape.shapes.item("rectangle")

Dim rectangleText As String
rectangleText = rectangle.Text

C#/互操作代码需要做同样的事情:

var groupShape = (Shape)Doc.Shapes.ItemU("groupShape");
var rectangle = (Shape)groupShape.Shapes.ItemU("rectangle");
var rectangleText = rectangle.Text // assuming Text is defined on the Shape interface

换句话说,始终注意您正在使用的类型;如果成员 returns 和 object 并且您需要它是更具体的类型,则需要先进行适当的转换,然后才能对成员调用进行编译时验证,或者转换为 dynamic 如果您不关心编译时验证并将它们推迟到 运行-time:

var text = (string)((dynamic)groupShape.Shapes.ItemU("rectangle")).Text

注意转换为 stringtext 将是 string。忘记这个转换,您的代码将不得不处理 dynamic 像癌症一样在整个执行路径中传播并破坏您的类型安全 - 而您不希望这样。

首先,尝试使用 .Item 而不是 .ItemU,这两个是不同的函数。默认值(您在 VBA 中隐式使用的那个)是 Item。您实际上可能在 c#

中处理不同的形状

其次,.Text要以大写T开头,小t的代码不能通过。确保小写的 .text 不是您从某处导入的扩展方法,(与 Visio 无关)

第三个注意事项 - 为确保从形状中获取文本,如您在 UI 中看到的那样,最好使用 shape.Characters.Text,因为万一形状包含字段,shape.Text 将 return 占位符 ('obj') 用于字段文本应放置的位置。但这适用于 VBA 和 C#

第四.. VBA中的groupShape似乎是一个变量名,而不是形状名。从代码中不清楚该组形状的名称是什么。你如何在 VBA 中得到那个?可能值得一试。

一如既往,我发现 .Text 是 returning "Obj" 的原因是形状中没有任何文本。如果有文字,它会 return 它。我太沉迷于 return、"Obj"。我想知道为什么它不 return 空文本或 null 如果形状中没有文本。无论如何,关于这个问题的所有其他答案都非常有帮助,它们引导我找到我的问题。