Visio页面按名称查找形状,没有例外

时间:2012-04-03 12:29:49

标签: c# visio shape comexception

在Visio VBA(或COM API)

如果找不到形状名称,如何在不期待异常的情况下获得形状?

...在我的visio页面中,可能有也可能没有名为“DraftText”的矩形形状。

我想检查它是否存在,如果是,请做smth。

我的代码似乎是:

Shape waterMarkRect = page.Shapes["DraftText"];
if (waterMarkRect == null)
{
   waterMarkRect = page.DrawRectangle(0, 0, 50, 15);
   waterMarkRect.Name = "DraftText";
   waterMarkRect.NameU = waterMarkRect.Name;
   waterMarkRect.Text = "INCONSISTANT";

   Layer wMarkLayer = page.Layers["WMark"] ?? page.Layers.Add("WMark");
   wMarkLayer.Add(waterMarkRect, 0);
}
...
...

问题是,如果形状“DraftText”不存在,我会得到COM异常。

因为我反对使用try catch block作为编码实用程序,

我正在寻找一种检查形状存在的方法,比如IDictionary.TryGetValue(,out);

或if(page.Shapes.Contain(“DraftText”))...

任何想法?

2 个答案:

答案 0 :(得分:1)

通过VBA执行此操作,我只是在尝试按名称获取形状之前执行“on next resume next”,并在出错时转到PROC_ERR以便以后恢复错误处理。

如果您无法禁用该异常,则可以遍历每个形状并根据您要查找的形状检查其名称。但是,与内置的名称查找相比,这需要花费更长的时间。

答案 1 :(得分:0)

使用try catch块

Shape waterMarkRect = null;
try { 
    waterMarkRect = page.Shapes["DraftText"];
}
catch (Exception){
}

if (waterMarkRect == null)
{
   waterMarkRect = page.DrawRectangle(0, 0, 50, 15);
   waterMarkRect.Name = "DraftText";
   waterMarkRect.NameU = waterMarkRect.Name;
   waterMarkRect.Text = "INCONSISTANT";

   Layer wMarkLayer = page.Layers["WMark"] ?? page.Layers.Add("WMark");
   wMarkLayer.Add(waterMarkRect, 0);
}