我正在尝试将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];
答案 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如果形状中没有文本。无论如何,这个问题的所有其他答案都非常有用,它们引导我找到问题所在。