Word VSTO加载项:删除GroupContentControl

时间:2018-05-09 15:24:22

标签: .net ms-word vsto

我正在使用我的第一个Word VSTO加载项。除此之外,我需要它使某些段落只读,但不是永久性的。我试图在运行时使用GroupContentControls(简称GCC)。

我已经完成了GCC创建:这很简单,我只是在MSDN上使用这个例子。但是,我似乎无法删除GCC。

这是我尝试过的代码:

// Get a VSTO document object
Document doc = Globals.Factory.GetVstoObject(Globals.ThisAddIn.Application.ActiveDocument); 
// Find the GCC in the document, by its ID
var controls = from GroupContentControl g in doc.Controls
               where g.ID.Equals(gcc_ID)
               select g;
// Safety check
if (controls == null)
    return;
if (controls.Count() == 0)
    return;
// Delete the GCC
var gc = controls.First();
gc.Delete(false);

为了简洁起见,我只列出了不起作用的代码。外接程序的其余部分的设计方式是,此代码仅在活动Word文档包含ID为与gcc_ID匹配的GroupContentControl时运行。

我在运行时遇到三种类型的错误:

  • 代码运行顺利,但GCC仍然存在,导致我相信我的一个安全测试被绊倒并且代码过早地返回
  • 代码在Delete调用时挂起,但有一个例外,即gc不是GroupContentControl。
  • 在我调试的早期,我也对gc变量赋值有一个例外,因为“controls”是“null”......这很奇怪,因为之前的安全测试没有跳过。但我似乎无法重现那种特定的结果。

是否有更简单,更好的方法来删除GroupContentControl,知道它的ID?我是.NET的新手,也是VSTO的新手,我可能会遗漏一些非常明显的东西。

1 个答案:

答案 0 :(得分:1)

调试此类事情时,第一步是使用" native" Word对象(Microsoft.Office.Interop.Word)并确保该级别的所有内容都正常工作。

如果您不需要VSTO对象,请不要使用它们 - 坚持使用原生对象。我根本不清楚为什么你需要一个VSTO GroupContentControl对象 - 据我所知,组内容控件没有特殊的VSTO功能。

尽管如此,如果您需要加载项中的VSTO对象,在运行时,您必须创建它们 - 每次加载项运行时。以下代码执行此操作。您应该从原生 Word文档开始,因为您以后需要这样做。

然后从本机Word文档创建VSTO文档对象。你基本上有这个,但应该从本机对象开始,而不是回到Globals ... ActiveDocument。请注意,我的代码在这方面与您的代码略有不同,因为我的目标是使用不同的.NET Framework。您应该继续使用Globals.Factory.GetVstoObject...

下一步是获取本机组内容控件。由于您有一个静态ID,并且您只想检索一个内容控件,因此只需直接解决它而不使用lamdas,集合或其他任何内容:doc.ContentControls[gcc_ID];

从本机内容控件中,您可以添加GroupContentControl类型的VSTO内容控件。此对象是动态的,并且一旦加载项超出范围,将保留在文档中(或其他任何位置)。

从现在开始,你应该没事。

    private void btnGroupCC_Click(object sender, RibbonControlEventArgs e)
    {
        Word.Document doc = Globals.ThisAddIn.Application.ActiveDocument;
        // Get a VSTO document object
        Microsoft.Office.Tools.Word.Document VSTOdoc = Microsoft.Office.Tools.Word.Extensions.DocumentExtensions.GetVstoObject(doc);
        // Find the GCC in the document, by its ID
        string gcc_ID = "778611894";
        Word.ContentControl cc = doc.ContentControls[gcc_ID];
        Microsoft.Office.Tools.Word.GroupContentControl gcc = VSTOdoc.Controls.AddGroupContentControl(cc, "groupCC");
        // Safety check
        if (gcc == null)
            MessageBox.Show("no group cc");

        // Delete the GCC

        gcc.Delete(false);
    }

参考:https://msdn.microsoft.com/en-us/library/bb386200.aspx#runtimeaddin,关于在运行时添加内容控件的主题。