Доступ к wordField.Code вызывает ошибку во время выполнения: «Это свойство недоступно для этого объекта». - PullRequest
0 голосов
/ 21 июня 2019

Я конвертирую проект VB6 в C #. Проект представляет собой надстройку Word (панель ленты Word), и мы используем Visual Studio Tools for Office (VSTO) и проект библиотеки классов.

MyProject добавляет поля слова с поддержкой макросов (тип: Word.WdFieldType.wdFieldMacroButton) в документ Word при щелчках элемента панели ленты (различные типы макросов).

Согласно этой статье я реализовал вызов кода в надстройке VSTO с использованием VBA. Я использую шаблон документа с поддержкой макросов (myTemplate.dotm) для определения событий двойного щелчка макроса

В настоящее время я реализую функцию редактирования (при двойном щелчке поля макроса открывается диалоговое окно редактирования).

Ниже приведены функции метода RunSelectedFieldTagMacro (), который

  1. Убить отслеживание ревизии
  2. Получить выбранный тег поля
  3. Запуск макроса поля тега (функция редактирования)
  4. Восстановление отслеживания версий

Здесь у меня есть класс FieldTags, инициализированный с использованием активного WordDocument.

internal FieldTags(Word.Document document){ //...}

В документе есть класс FieldTag, инициализированный из wordField. В классе FieldTags я использую private List<FieldTag> fieldTagsList для хранения объектов FieldTag, определенных в методе CollectionLoad() в классе FieldTags (Я использую список здесь, потому что я должен добавить новые полевые метки к слову документ в эту коллекцию, как в том порядке, в котором они находятся в документе.).

Итак, мой вопрос,

Я дважды щелкаю метку в текстовом документе. Таким образом, макрос VBA выполняется и через надстройку VSTO метод RunSelectedFieldTagMacro () в проекте класса.

Там, после загрузки fieldTagsList, происходит функция редактирования, и MyProject добавляет новый fieldTag прямо над тегом поля редактирования (здесь мы делаем, вставляем новый тег поля, затем удаляем старый с его подполями).

public FieldTag Add(Word.Range wordRange, Tag tag)
    {
        try
        {
            FieldTag fieldTag;
            Word.Field wordField;

            //Create a new field at the specified range.
            wordField = wordRange.Fields.Add(Range: wordRange, PreserveFormatting: false);

            //Insert the contents of the new field.
            tag.InsertFieldContents(wordField);

            //Field must be updated to display properly and for style to be correctly applied.
            wordField.Update();

            //Add a FieldTag to the Document.FieldTags collection.
            fieldTag = this.AddFieldTag(wordField);

            //Apply style to the new FieldTag.
            fieldTag.ApplyStyle();

            return fieldTag;
        }
        catch(Exception ex)
        {
        }
    }

В разделе «Добавить метку поля к части Document.FieldTags collection» мы проверяем Item By RangeStart.

private FieldTag ItemByRangeStart()
{
    for (int i = fieldTagsList.Count; i > 1; i--)
    {
        fieldTag = fieldTagsList[i-1];

        if (rangeStart > fieldTag.WordField.Code.Start)
        {
            return fieldTag;
        }
    }   
}

К этому времени новый тег поля был добавлен в документ. В цикле при проверке тега поля с двойным щелчком (редактирование) fieldTag.WordField.Code выдает ошибку ниже.

fieldTag.WordField.Code выдает исключение типа System.Runtime.InteropServices.COMException

Это свойство недоступно для этого объекта.

При попытке запустить функцию редактирования с помощью двойного щелчка тега поля слова возникает эта ошибка. Я также могу запустить функцию редактирования тега поля через, выберите тег поля и затем запустите метод RunSelectedFieldTagMacro() через visual studio. Но тогда эта ошибка не возникает.

Оба процесса выполняются с одинаковыми кодами. Единственное отличие состоит в том, что при возникновении ошибки: я начинаю с двойного щелчка по метке поля. а при запуске через visual studio я вручную выбираю диапазон тегов поля.

У кого-нибудь есть идея, почему я не могу получить доступ к wordField.Code после вставки нового тега поля? Я действительно застрял здесь.

Заранее спасибо.

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

...