VSTO: подсчитать весь диапазон.Найти результаты

Я использую метод Find.HitHighlight, чтобы отмечать все вхождения определенного слова. Кроме того, я хочу показать пользователю слова, или прокрутить до них, или даже просто посчитать, сколько слов было найдено.

В настоящее время я использую этот код:

Word.Range range = Globals.ThisAddIn.Application.ActiveDocument.Range();
range.Find.HitHighlight(
     FindText: "dog",
     MatchCase: false, MatchWholeWord: true,
     HighlightColor: item.color);

Вопрос в том, есть ли способ вернуть один из упомянутых мной запросов, используя метод Find.HitHighlight или другой метод, или нет другого выбора, кроме как использовать следующий код:

var text = range.Text.Split(' ');
text.Count(word => word.Equals("dog"));

(Я предпочитаю не использовать этот код, потому что считаю, что есть способ использовать инструменты MSWord и не брать весь текст сам)

Ммм, на самом деле в Word этот инструмент уже встроен в более поздних версиях. Нажмите Ctrl + F, чтобы открыть панель поиска. Введите термин, который вы хотите найти, вверху, и Word покажет вам весь список - выберите тот, который интересует из списка ...

Cindy Meister 01.05.2018 21:36

Да, конечно, я это знаю! Мне просто нужно было сделать это программным способом.

baruchiro 02.05.2018 05:17

Хорошо - не все, кто работает на стороне C#, всегда знают эти вещи :-) Просто хотел убедиться, что вы действительно хотите «заново изобрести колесо»!

Cindy Meister 02.05.2018 15:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
370
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В объектной модели Word нет ничего, что возвращало бы все «совпадения», найденные с помощью HitHighlight. Он просто не предназначен для возврата несмежных коллекций Range, как правило, в соответствии с какими-либо конкретными атрибутами.

Если вам просто нужен счетчик, то код C#, который у вас уже есть, вероятно, будет самым быстрым в исполнении. Вы потеряете любую информацию о форматировании и местоположении, но для подсчета это не важно.

Для всего остального вам нужно будет сделать обычный Find.Execute в цикле, добавляя каждый найденный Range в массив (или что-то еще). Это позволит вам, например, показать пользователю список с окружающим текстом.

Когда вы используете Range.Find (в отличие от Document.Content.Find) при успешном поиске, объект Range содержит найденный текст. Уловка с чем-то вроде этого заключается в том, что после успешного поиска необходимо сбросить диапазон, чтобы продолжить. Что-то вроде этого (набрано по памяти, возможно, синтаксические ошибки):

Word.Range rngDoc = wrdDocument.Content;
Word.Range rngFind = rngDoc.Duplicate;
bool bFound = true;
object oCollapseEnd = Word.WdCollapseDirection.wdCollapseEnd;
while (bFound)
{
  bFound = rngFind.Find.Execute(/*params here*/);
  if (bFound)
  {
     //Do something with rngFind
     //Set the start of the Range to search AFTER what was found
     rngFind.Collapse(ref oCollapseEnd);
     //and extend it to the end of the original Range
     // in this case the entire document
     rngFind.End = rngDoc.End;
  }
}

Другие вопросы по теме