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