我需要实现“查找”对话框提供的“搜索”功能,当按下Ctrl + F时,该对话框会弹出。
我有一个文本框,用户输入要搜索的字符串,以及“搜索”按钮。单击按钮时,需要突出显示HTML文档中的匹配项 - 与“查找”对话框中实现的完全相同。
有没有办法绕过WebBrowser控件中的“查找”对话框?是否可以将搜索参数发送到“查找”功能?
提前感谢您的帮助。
修改
理想情况下,我可以使用“查找”对话框提供的全部功能,包括“仅匹配整个世界”,“匹配大小写”和“突出显示所有匹配项”......
答案 0 :(得分:0)
自己并不难做到,所有你做的就是用以下内容替换Search TextBox中的任何内容,比如搜索术语是“hello”,然后用以下内容替换hello的所有出现:
<font color="yellow">hello</font>
当然,这个HTML可以替换为SPAN标记(这是DIV标记的内联版本,因此您的行不会使用SPAN中断,但会使用DIV)。但在任何一种情况下,这两个标签都有一个样式属性,你可以使用CSS来改变它的颜色或其他与CSS兼容的其他属性,如下所示:
<SPAN style="background-color: yellow;">hello</SPAN>
当然,还有很多其他方法可以使用HTML更改颜色,如果需要,可以随意在网上搜索。
现在,您可以使用dotnet中的.Replace()函数来执行此操作(替换搜索到的文本),这非常简单。因此,您可以使用.DocumentText将整个文档作为字符串获取,并且一旦所有出现被替换(使用.Replace()),您可以将其设置回.DocumentText(所以,您使用.DocumentText来获取原始文档字符串,并使用替换的字符串设置.DocumentText)。当然,您可能不希望对实际HTML中的项目执行此操作,因此您可以通过对所有元素执行For Each循环来遍历页面上的所有元素,如下所示:
For Each someElement as HTMLElement in WebBrowser1.Document.All
每个元素都有一个.InnerText / .InnerHTML和.OuterText / .OuterHTML,你可以获取(读取)和设置(用替换文本覆盖)。
当然,根据您的需要,您可能只想更换和覆盖.InnerText和/或.OuterText。
如果您需要更多帮助,请与我们联系。在任何一种情况下,无论如何,我想知道它是如何成功的,或者我们中是否还有更多可以为您的问题增加价值。欢呼声。
答案 1 :(得分:0)
我遇到了很多困难,但我终于找到了解决方案。它有些混乱,但它可以像Winforms WebBrowser控件一样工作。这是在.Net 4.0中导入的Microsoft.mshtml 7.0.3300引用。
using mshtml;
private int _findClicks = 0;
private string _searchText = "";
public string SearchText
{
get { return _searchText; }
set
{
if (value.ToUpper() != _searchText)
{
ClearFind();
_searchText = value.ToUpper();
txtSearch.Text = value.ToUpper();
_findClicks = 0;
}
}
}
private void btnSearch_Click(object sender, EventArgs e)
{
SearchText = txtSearch.Text;
if (_findClicks == 0)
FindFirst();
else
FindNext();
}
/// <summary>
/// Search through all text to find. Sets all occurrences to background color yellow.
/// </summary>
private void FindFirst()
{
if (_searchText == "")
return;
IHTMLDocument2 doc = webBrowser1.Document.DomDocument as IHTMLDocument2;
IHTMLSelectionObject sel = doc.selection;
IHTMLTxtRange range = sel.createRange() as IHTMLTxtRange;
//Mark all occurrences with background color yellow
while (true)
{
if ((range.findText(_searchText)) && (range.htmlText != "span style='background-color: yellow;'>" + _searchText + "</span>"))
{
range.pasteHTML("<span style='background-color: yellow;'>" + _searchText + "</span>");
}
else
break;
}
//Move to beginning and select first occurence.
range.moveStart("word", -9999999);
range.findText(_searchText);
range.select();
_findClicks++;
}
/// <summary>
/// Finds next occurrence of searched text and selects it.
/// </summary>
private void FindNext()
{
if (_searchText == "")
return;
IHTMLDocument2 doc = webBrowser1.Document.DomDocument as IHTMLDocument2;
IHTMLSelectionObject sel = doc.selection;
IHTMLTxtRange range = sel.createRange() as IHTMLTxtRange;
range.collapse(false); // collapse the current selection so we start from the end of the previous range
if (range.findText(_searchText, 1000000, 0))
{
range.select();
}
else // If at end of list, go to beginning and search one more time.
{
range.moveStart("word", -9999999);
if (range.findText(_searchText, 1000000, 0))
{
range.select();
}
}
}
/// <summary>
/// Remove highlighting on all words from previous search.
/// </summary>
private void ClearFind()
{
if (_searchText == "" || webBrowser1.ReadyState != WebBrowserReadyState.Complete)
return;
IHTMLDocument2 doc = webBrowser1.Document.DomDocument as IHTMLDocument2;
IHTMLSelectionObject sel = doc.selection;
IHTMLTxtRange range = sel.createRange() as IHTMLTxtRange;
range.moveStart("word", -9999999);
while (true)
{
if ((range.findText(_searchText)) && (!range.htmlText.Contains("span style='background-color: white")))
{
range.pasteHTML("<span style='background-color: white;'>" + _searchText + "</span>");
}
else
break;
}
}
同样,这有点凌乱,可能会被清理一下。这几乎复制了Web浏览器控件中Ctrl + F功能的基础知识。希望它对所有未来的读者都有帮助。