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""";
}
我在使用 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""";
}