Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中复选框和文本之间的自动断开#_C#_Checkbox_Ms Word_Office Interop - Fatal编程技术网

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();

我希望你能帮我解决我的问题

我想用C#程序自动生成一个单词清单

但是我不能让它把文本放在复选框后面。文本始终位于复选框下的新行中

我怎样才能解决这个问题

你知道其他的功能吗

    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]的内存不足 应用程序引用]可能在第一个过程中幸存下来,但 将在下一次传递时标记为收集。所以我们会 进行第二次检查,清理第一次检查后幸存下来的所有物品 但在其他方面可供收集

检查它是否对您有帮助。您可以使用确定addition
GC.Collect();GC.WaitForPendingFinalizers()
调用是必需的。i、 e.
do{GC.Collect();GC.WaitForPendingFinalizers();}while(Marshal.arecomObject savailableforCleanup())