C# VSTO Word加载项:如何在数组单元格中添加内容控件

C# VSTO Word加载项:如何在数组单元格中添加内容控件,c#,vsto,C#,Vsto,我正在构建一个VSTO Word外接程序,单击它可以创建一个数组。在其中一个数组单元格中,我想添加一些文本、新行和richtext内容控件 我已通过使用以下代码使其正常工作: Word.Table table = Globals.MyAddIn.Application.ActiveDocument.Tables.Add(currentRange, 8, 3, ref missing, ref missing); range = table.Cell(1, 3).Range; range.Text

我正在构建一个VSTO Word外接程序,单击它可以创建一个数组。在其中一个数组单元格中,我想添加一些文本、新行和richtext内容控件

我已通过使用以下代码使其正常工作:

Word.Table table = Globals.MyAddIn.Application.ActiveDocument.Tables.Add(currentRange, 8, 3, ref missing, ref missing);
range = table.Cell(1, 3).Range;
range.Text = "SomeText" + Environment.NewLine;
range.MoveStartUntil(Environment.NewLine, Word.WdConstants.wdForward);
range.MoveStart(Word.WdUnits.wdCharacter, 1);
range.MoveEnd(Word.WdUnits.wdCharacter, -1);
Word.ContentControl cc = range.ContentControls.Add();
cc.Tag = "someTag";
我不明白为什么需要MoveStart和MoveEnd指令,而不只是使用MoveStartUntil指令。有更好的方法吗

另外,我想在我写的文本上添加粗体效果,但不在将在内容控制字段中写入的文本上添加粗体效果。我尝试添加以下代码,但它适用于all单元格,而不仅仅是我的文本

range.Bold = 1;

我猜你在新词方面遇到了麻烦。在这种情况下,最好的方法是在代码运行时一步一步地检查代码,并在每一步检查文本的值。我通常发现自己无论如何都必须这样做,只是为了让事情顺利进行

Word.Table table = Globals.MyAddIn.Application.ActiveDocument.Tables.Add(currentRange, 8, 3, ref missing, ref missing);
range = table.Cell(1, 3).Range;
// The text here starts as "\r\a"; if you turn on paragraph marks you will see an icon in each table cell; this must be that character

range.Text = "SomeText" + Environment.NewLine;
// Now the text is now "SomeText\r\r\a" (NewLine is "\r\n" and I think "\n" gets converted to "\r")
// Note that Word will put \r or \a back if you omit them, since you're in a table cell

range.MoveStartUntil(Environment.NewLine, Word.WdConstants.wdForward);
// Now it's "\r\r\a"

range.MoveStart(Word.WdUnits.wdCharacter, 1);
// "\r\a"

range.MoveEnd(Word.WdUnits.wdCharacter, -1);
// finally the text is null (because it's a 0-length range), and in the needed location

Word.ContentControl cc = range.ContentControls.Add();
cc.Tag = "someTag";
您还希望将第一行加粗,但在这些步骤中,没有一个只是选择的文本SomeText,您需要省略尾随字符,或者在它们之前插入的任何内容也将具有指定的格式,因此您必须在使用range.bold=1之前对其进行一点修改

这是一种你可以做到的方法:

Range currentRange = Paragraphs[3].Range;
Table table = Tables.Add(currentRange, 8, 3, ref missing, ref missing);
Range range = table.Cell(1, 3).Range;
// Starts as "\r\a"

range.Text = "SomeText";
// The text is now "SomeText\r\a"

range.MoveEnd(WdUnits.wdCharacter, -1);
// "SomeText"

range.Bold = 1;
range.InsertParagraphAfter();
// "SomeText\r" (this puts the paragraph mark inside the current range which is kind of counter-intuitive)

range.Collapse(WdCollapseDirection.wdCollapseEnd);
// This is the new paragraph

Interop.ContentControl cc = range.ContentControls.Add();
cc.Tag = "someTag";

您显示的代码是正确的,这只是如何使用范围对象的问题。当然不止一种方法。下面的代码示例是我的首选

基本上,您需要做三件事,因此需要对目标范围进行三次处理:文本+粗体;新的一段;添加内容控件

使用一个范围,然后向其中添加一些内容的关键是折叠该范围。想象一下,按下键盘上的右箭头键将选择折叠为闪烁的插入点。同样需要在一定范围内进行;使用折叠方法,折叠到终点。也可以选择折叠到起点

将文本放入范围,然后执行所需的任何格式设置。然后插入段落标记,然后需要再次折叠范围。表格单元格是一种特殊情况:当折叠到表格单元格末尾时,焦点会在下一个单元格中结束。所以有必要向后移动一个角色

然后可以添加内容控件

    object oCollapseEnd = Word.WdCollapseDirection.wdCollapseEnd;
    rng.Collapse(ref oCollapseEnd);
    Word.Table table = doc.Tables.Add(rng, 8, 3, ref missing, ref missing);
    Word.Range range = table.Cell(1, 3).Range;
    range.Text = "SomeText";
    range.Font.Bold = -1;
    range.InsertAfter(Environment.NewLine);
    range.Collapse(ref oCollapseEnd);
    range.MoveEnd(Word.WdUnits.wdCharacter, -1);
    Word.ContentControl cc = range.ContentControls.Add();
    cc.Tag = "someTag";

粗体效果不仅适用于第一行,而且适用于所有文本,我必须在粗体效果之前添加range.MoveEnd指令。