C# C中复选框和文本之间的自动断开#
我希望你能帮我解决我的问题 我想用C#程序自动生成一个单词清单 但是我不能让它把文本放在复选框后面。文本始终位于复选框下的新行中 我怎样才能解决这个问题 你知道其他的功能吗C# C中复选框和文本之间的自动断开#,c#,checkbox,ms-word,office-interop,C#,Checkbox,Ms Word,Office Interop,我希望你能帮我解决我的问题 我想用C#程序自动生成一个单词清单 但是我不能让它把文本放在复选框后面。文本始终位于复选框下的新行中 我怎样才能解决这个问题 你知道其他的功能吗 public void createChecklist() { Application app = new Application(); app.Visible = true; Document doc = app.Documents.Add();
public void createChecklist()
{
Application app = new Application();
app.Visible = true;
Document doc = app.Documents.Add();
Paragraph para = doc.Paragraphs.Add();
ContentControl checkbox = para.Range.ContentControls.Add(WdContentControlType.wdContentControlCheckBox);
para.Range.InsertAfter("sdjsakd");
doc.SaveAs2("C:\\tmp\\checklist.docx");
app.Quit();
}
这种行为的原因是因为文本的“目标”是整个段落的范围。因此,当在后面插入某个内容时,它会在段落后面插入 关键是将范围恢复到段落范围内-不包括段落标记。(段落标记在屏幕截图中不可见,因为非打印字符的显示被抑制。单击功能区“主页”选项卡中的“向后P”,段落标记应可见。) 有多种方法来实现这一点<代码>范围。MoveEnd经常使用(如下所示) 注意:使用COM“interop”不清理对象是危险的。这可能很快导致应用程序的“孤立”实例留在内存中。因为问题中的代码退出了Word应用程序,所以我将其添加到了代码示例中
public void createChecklist()
{
Application app = new Application();
app.Visible = true;
Document doc = app.Documents.Add();
Paragraph para = doc.Paragraphs.Add();
Range rng = para.Range;
ContentControl checkbox = rng.ContentControls.Add(WdContentControlType.wdContentControlCheckBox);
rng.MoveEnd(WdUnits.wdCharacter, -1);
rng.InsertAfter(" sdjsakd");
doc.SaveAs2("C:\\tmp\\checklist.docx");
//Release the COM objects and clean up
checkbox = null;
rng = null;
para = null;
doc = null;
app.Quit();
app = null;
GC.Collect(); GC.AwaitPendingFinalizers();
GC.Collect(); GC.AwaitPendingFinalizers();
}
添加注释以澄清为什么要运行两次垃圾收集的问题:
此信息来自Andrew Whitechapel的“Microsoft Office的.Net开发”,第2章,其摘录在MSDN上不再提供,因此在此引用:
请注意,我们正在重复调用Collect
和
WaitForPendingFinalizers
这是因为[Office]的内存不足
应用程序引用]可能在第一个过程中幸存下来,但
将在下一次传递时标记为收集。所以我们会
进行第二次检查,清理第一次检查后幸存下来的所有物品
但在其他方面可供收集
检查它是否对您有帮助。您可以使用确定additionGC.Collect();GC.WaitForPendingFinalizers()
调用是必需的。i、 e.do{GC.Collect();GC.WaitForPendingFinalizers();}while(Marshal.arecomObject savailableforCleanup())代码>