Я конвертирую проект VB6 в C #. Проект представляет собой надстройку Word (панель ленты Word), и мы используем Visual Studio Tools for Office (VSTO) и проект библиотеки классов.
MyProject добавляет поля слова с поддержкой макросов (тип: Word.WdFieldType.wdFieldMacroButton
) в документ Word при щелчках элемента панели ленты (различные типы макросов).
Согласно этой статье я реализовал вызов кода в надстройке VSTO с использованием VBA.
Я использую шаблон документа с поддержкой макросов (myTemplate.dotm) для определения событий двойного щелчка макроса
В настоящее время я реализую функцию редактирования (при двойном щелчке поля макроса открывается диалоговое окно редактирования).
Ниже приведены функции метода RunSelectedFieldTagMacro (), который
- Убить отслеживание ревизии
- Получить выбранный тег поля
- Запуск макроса поля тега (функция редактирования)
- Восстановление отслеживания версий
Здесь у меня есть класс 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 после вставки нового тега поля? Я действительно застрял здесь.
Заранее спасибо.
Примечание: я не могу добавить все коды здесь, так как в этом процессе много средних классов. Надеюсь, вы, ребята, поймете, что мой вопрос.