如何正确阅读Visio Shape的文本

时间:2017-10-23 04:44:33

标签: c# vba com-interop visio

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

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

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

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

这不会返回正确的值。它说它将返回“对象”,所以我相信它不会返回一个字符串而是一个对象。

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

编辑: 这是我写的实际代码。 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];

3 个答案:

答案 0 :(得分:2)

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

中处理不同的形状

其次,.Text应该以大写字母T开头,带小t的代码不应该编译。确保.text小写不是您从某处导入的扩展方法(与Visio无关)

第三个警告 - 为了确保在UI中看到形状的文本,最好使用shape.Characters.Text,因为如果形状包含字段,shape.Text将返回占位符(' obj')用于那些字段文本应该去的地方。但这适用于VBA和C#

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

答案 1 :(得分:1)

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

groupShape.shapes.item("rectangle")

返回Shape个对象。抓住该对象引用而不是用另一个点丢弃它。 VBA正在帮助"在这里,并且愉快地允许你编写只能在运行时解决的后期绑定调用 - C#只能使用dynamic关键字进行许可,并且您通常不想针对{{1}进行编码} - 你想使用强类型:

dynamic

C#/ interop代码需要做同样的事情:

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

Dim rectangleText As String
rectangleText = rectangle.Text

换句话说,要始终了解您正在使用的类型;如果一个成员返回一个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 而你需要它是一个更具体的类型,你需要在你可以对成员调用进行编译时验证之前进行适当的转换,或者如果你需要转换为object不关心编译时验证并将它们推迟到运行时:

dynamic

注意投射到var text = (string)((dynamic)groupShape.Shapes.ItemU("rectangle")).Text ; string将是text。忘记演员表,你的代码将不得不处理string在整个执行路径中传播,如癌症和破坏你的类型安全 - 而且你不想要那样。

答案 2 :(得分:1)

与往常一样,我来找出.Text返回“Obj”的原因是形状中没有任何文字。如果有文本,它将返回它。我太过追赶了回归,“Obj”。我想知道为什么它不返回空文本或null如果形状中没有文本。无论如何,这个问题的所有其他答案都非常有用,它们引导我找到问题所在。