c#如何使用字段相关的Visio.Shape属性

c# How to use Visio.Shape properties related to fields

我在使用 C# 与 Visio.Shape 项目交互时遇到了一些问题。

我能够遍历页面中的每个形状,当我这样做时 myShapeObj.Text 我往往会得到正确的文本。但是,我的 visio 文档具有链接到自定义字段的形状。 字段 > 自定义公式 = ThisDoc!User.mycustomproperty。

我有一个名为 "User.mycustomproperty" 的用户定义单元格,它包含诸如“02a”、“03”等值 字符串 returns 在 visual Studio 的调试 window 中显示为无法识别的字符。 是否可以将值解析为文本?

还有第二个相关问题: 有没有简单的方法来 get/set 这个用户定义的单元格?

访问形状的文本有两个主要属性 - 如您所知,一个是 Shape.Text,另一个是 Shape.Characters。后者 returns 一个 Characters 对象,它有许多用于阅读和操作文本的成员。

其中有 Characters.Text 属性 returns 整个文本,包括扩展字段。

所以,如果你有三个像这样的形状:

...然后 运行 此代码:

void Main()
{
    var vApp = MyExtensions.GetRunningVisio();
    var vPag = vApp.ActivePage;
    foreach (Visio.Shape shp in vPag.Shapes)
    {
        Console.WriteLine($"Text: {shp.Text} \nCharacters: {shp.Characters.Text}\n");
    }
}

...您将得到以下输出:

文本:没有字段的形状 1

字符:没有字段的形状 1

文本:带有文档字段的形状 2 []

字符:带有文档字段的形状 2 [02a]

文本:带有日期时间字段的形状 3 []

字符:带日期时间字段的形状 3 [2017 年 11 月 20 日,星期一]

在这里您可以看到 Shape.Text returns 折叠的字段和 Shape.Characters.Text returns 展开的字段。

请注意,GetRunningVisio 是我与 LinqPad 一起使用的扩展方法:

http://visualsignals.typepad.co.uk/vislog/2015/12/getting-started-with-c-in-linqpad-with-visio.html

...但是如何获取应用程序对象取决于您。


对于你关于设置用户单元格的第二个问题,我会做这样的事情:

const string targetCellName = "User.mycustomproperty";
var docSheet = vDoc.DocumentSheet;
if (docSheet.CellExistsU[targetCellName, (short)0] != 0)
{
    vDoc.DocumentSheet.CellsU[targetCellName].FormulaU = @"=""04a""";
}