C# 向突出显示文本的windows窗体web浏览器控件添加搜索框

C# 向突出显示文本的windows窗体web浏览器控件添加搜索框,c#,winforms,webbrowser-control,C#,Winforms,Webbrowser Control,我有一个使用c应用程序的windows窗体。它显示一个网页,并具有文本框/按钮组合,可用于搜索显示给用户的文本。目前,我在文本框中搜索所有元素的内部文本。然后我剔除了多余的元素,例如一个单词可以在一个'p'和'b'元素中,其中'b'是'p'的子元素,所以返回的元素应该是'b'。最后,我在找到的元素上运行ScrollIntoViewtrue方法 我现在想添加一个函数,突出显示文本,就像在真实的webbrowser中搜索一个术语一样。我的第一个想法是在文本周围注入html和/或javascript代

我有一个使用c应用程序的windows窗体。它显示一个网页,并具有文本框/按钮组合,可用于搜索显示给用户的文本。目前,我在文本框中搜索所有元素的内部文本。然后我剔除了多余的元素,例如一个单词可以在一个'p'和'b'元素中,其中'b'是'p'的子元素,所以返回的元素应该是'b'。最后,我在找到的元素上运行ScrollIntoViewtrue方法

我现在想添加一个函数,突出显示文本,就像在真实的webbrowser中搜索一个术语一样。我的第一个想法是在文本周围注入html和/或javascript代码,但这似乎是一个混乱的解决方案


我该怎么做有什么想法吗?谢谢你的帮助

我知道这个话题已经很老了,但我遇到了与话题作者相同的问题,在我寻找答案的过程中,我终于找到了答案。因此,我借此机会在这里与大家分享

以下是我在WebBrowser中执行搜索并突出显示找到的单词时使用的方法:

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;
  }

这段代码的唯一问题是一次只选择一个查找到的单词。

只需在文本框[here 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;
}

这里有一篇文章向你展示了如何做到这一点。谢谢,但这种解决方案会将html注入页面,这可能会扰乱页面布局,我正试图避免这种做法。我在那个页面上找到了一个链接,它试图用javascript来实现这一点,我来看看。