Добавление окна поиска в Windows формирует элемент управления веб-браузера, который выделяет текст - PullRequest
0 голосов
/ 10 июня 2010

У меня есть приложение Windows Forms (с помощью C #). Он отображает веб-страницу и имеет комбинацию текстового поля / боттона, которую можно использовать для поиска текста, отображаемого пользователю. В настоящее время я ищу внутренний текст всех элементов для текста в текстовом поле. И затем я отсеял элементы, которые являются избыточными (например, слово может быть в элементах «p» и «b», где «b» является дочерним элементом «p», поэтому возвращаемый элемент должен быть «b») , Наконец, я запускаю метод ScrollIntoView (true) для найденного элемента.

Теперь я хотел бы добавить функцию, которая выделяет текст (например, если вы ищете термин в реальном веб-браузере). Моей первой мыслью было просто ввести html и / или javascript код вокруг текста, но это выглядит как грязное решение.

Есть идеи, как мне это сделать? Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 18 июля 2018

Просто примите ввод от пользователя в текстовом поле [здесь txtNoteSearch] и затем следуйте следующему коду для осуществления поиска.Следующий код демонстрирует поиск и выделение.

private void WebBrowser_DocumentCompleted(object sender, System.Windows.Forms.WebBrowserDocumentCompletedEventArgs e)
{
    mshtml.IHTMLDocument2 doc2 = WebBrowser.Document.DomDocument;
    string ReplacementTag = "<span style='background-color: rgb(255, 255, 0);'>";
    StringBuilder strBuilder = new StringBuilder(doc2.body.outerHTML);
    string HTMLString = strBuilder.ToString();
    if (this.m_NoteType == ExtractionNoteType.SearchResult)
    {
        List<string> SearchWords = new List<string>();
        SearchWords.AddRange(this.txtNoteSearch.Text.Trim.Split(" "));
        foreach (string item in SearchWords)
        {
            int index = HTMLString.IndexOf(item, 0, StringComparison.InvariantCultureIgnoreCase);
            // 'If index > 0 Then
            while ((index > 0 && index < HTMLString.Length))
            {
                HTMLString = HTMLString.Insert(index, ReplacementTag);
                HTMLString = HTMLString.Insert(index + item.Length + ReplacementTag.Length, "</span>");
                index = HTMLString.IndexOf(item, index + item.Length + ReplacementTag.Length + 7, StringComparison.InvariantCultureIgnoreCase);
            }
        }
    }
    else
    {
    }
    doc2.body.innerHTML = HTMLString;
}
0 голосов
/ 15 апреля 2014

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

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

private bool FindFirst(string text)
  {
     var doc = (IHTMLDocument2)WebBrowser.Document.DomDocument;
     var sel = (IHTMLSelectionObject)doc.selection;
     sel.empty(); // get an empty selection, so we start from the beginning
     var rng = sel.createRange() as IHTMLTxtRange;
     if (rng != null && rng.findText(text, 1000000000, 0))
     {
        rng.select();
        rng.scrollIntoView(false);
        return true;
     }
     return false;
  }

  /// <summary>
  /// 
  /// </summary>
  /// <param name="text"></param>
  /// <returns></returns>
  public bool FindNext(string text)
  {
     var doc = (IHTMLDocument2)WebBrowser.Document.DomDocument;
     var sel = (IHTMLSelectionObject)doc.selection;
     var rng = sel.createRange() as IHTMLTxtRange;
     if (rng != null)
     {
        rng.collapse(false); // collapse the current selection so we start from the end of the previous range
        if (rng.findText(text, 1000000000, 0))
        {
           rng.select();
           rng.scrollIntoView(false);
           return true;
        }
        else
           return FindFirst(text);
     }
     return false;
  }

  /// <summary>
  /// 
  /// </summary>
  /// <param name="text"></param>
  /// <returns></returns>
  public bool FindPrevious(string text)
  {
     var doc = (IHTMLDocument2)WebBrowser.Document.DomDocument;
     var sel = (IHTMLSelectionObject)doc.selection;
     var rng = sel.createRange() as IHTMLTxtRange;
     if (rng != null)
     {

        rng.collapse(true); // it should be true,so it goes to start of the document
        var found = rng.findText(text, -1, 0); // Range count value should give negative value
        if(!found)
        {
           rng.moveEnd("textedit");
           found = rng.findText(text, -1, 0);
        }
        if (found)
        {
           rng.select();
           rng.scrollIntoView(false);
           return true;
        }
     }
     return false;
  }

Единственная «проблема» с этим фрагментом кода состоит в том, что за один раз выбирается только одно вхождение найденных слов.

...