Как использовать Word RepeatingSection ContentControl в защищенном текстовом документе - PullRequest
0 голосов
/ 09 июня 2018

Элемент списка

Я реализую шаблон Word для приложения для заполнения форм с использованием VSTO и c # в Visual Studio 2017 и хочу воспользоваться преимуществами управления содержимым повторяющегося раздела Word.Тем не менее, я не могу программно применить этот тип контроля после того, как я ранее защитил документ для заполнения формы.Похоже, что незащищенный документ не возвращает документ в то же незащищенное состояние в этом контексте, что и до его защиты.Вот урезанная демонстрационная программа для выделения проблемы:

В Visual Studio создайте новый проект шаблона VSTO для Word 2013 и 2016, оставив в проекте неизменный пустой шаблон документа по умолчанию, добавьте следующий код вЧастичный класс ThisDocument

private void ThisDocument_Startup(object sender, System.EventArgs e)
    {
        //Demonstrates an unexpected impact of protecting then subsequently unprotecting a document 
        AddTableDirect();
        DocProtect();
        DocUnprotect();
        AddTableRepeatingSection();
    }
    private void ThisDocument_Shutdown(object sender, System.EventArgs e)
    {
    }
    private void DocProtect()
    {
        //Protects the active document restricting the operator to form filling
        object noReset = true;
        object password = System.String.Empty;
        object useIRM = false;
        object enforceStyleLock = false;
        this.Protect(Word.WdProtectionType.wdAllowOnlyFormFields,
            ref noReset, ref password, ref useIRM, ref enforceStyleLock);
    }
    private void DocUnprotect()
    {
        // Unprotects the active document allowing programmatic manipulation
        object password = System.String.Empty;
        this.Unprotect(ref password);
    }
    private void AddTableDirect()
    {
        //Creates a one row table directly adding a single plain text content control
        Word.Range range = this.Sections[1].Range.Paragraphs[1].Range;
        Word.Table table = this.Tables.Add
            (range, 1, 1, Word.WdDefaultTableBehavior.wdWord9TableBehavior, Word.WdAutoFitBehavior.wdAutoFitWindow);
        Word.ContentControl cc = this.ContentControls.Add
            (Word.WdContentControlType.wdContentControlText, table.Cell(1, 1).Range);
    }
    private void AddTableRepeatingSection()
    {
        //Programatically duplicates the table as a repeating section
        Word.Table table = this.Sections[1].Range.Tables[1];
        Word.Range rSRange = table.Range;
        Word.ContentControl rSCC = this.ContentControls.Add
            (Word.WdContentControlType.wdContentControlRepeatingSection, rSRange);
        rSCC.RepeatingSectionItems[1].InsertItemAfter();
    }

Если вы создаете и запускаете этот код как есть, то System.Runtime.InteropServices.COMException генерируется с текстом: «Этот метод или свойство недоступно, поскольку текущий выбор частично покрывает элемент управления содержимым простого текста«на оператор, который добавляет элемент управления« Повторяющаяся секция »в методе AddTableRepeatingSection() (строка перед InsertItemAfter).

Однако, если вы закомментируете операторы DocProtect() и DocUnprotect() в ThisDocument_StartUp, тогдаэтот код выполняется успешно.

Что мне нужно изменить, чтобы позволить мне защищать и снимать защиту с документа без создания этого исключения при программном применении повторяющегося элемента управления содержимым раздела?

1 Ответ

0 голосов
/ 13 июня 2018

Я могу продублировать то, что вы видите - я не знаю, почему это происходит, похоже, что это некое условие гонки, потому что после открытия документа (нажмите «Продолжить») он работает вручную ...

Я нашел обходной путь.Похоже, что при выборе таблицы все, что заставляет Word выбрать элемент управления содержимым в первой ячейке, где оно принадлежит:

private void AddTableRepeatingSection()
{
    //Programatically duplicates the table as a repeating section
    Word.Table table = this.Sections[1].Range.Tables[1];
    Word.Range rSRange = table.Range;
    rSRange.Select();
    Word.Range r = this.Application.Selection.Range;
    Word.ContentControl rSCC = this.ContentControls.Add
        (Word.WdContentControlType.wdContentControlRepeatingSection, r);
    rSCC.RepeatingSectionItems[1].InsertItemAfter();
}
...