加入收藏 | 设为首页 | 会员中心 | 我要投稿 新余站长网 (https://www.0790zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

vb.net WebBrowser页面与WinForm交互技巧

发布时间:2020-12-24 11:40:36 所属栏目:站长百科 来源:网络整理
导读:最近看到博客园入门教学文章比较流行,自己最近又偷懒比较多,没啥心得,不妨写一篇没啥深度的入门文章吧。 话说有了WebBrowser类,终于不用自己手动封装SHDocVw的AxWebBrowser这个ActiveX控件了。这个类如果仅仅作为一个和IE一模一样浏览器,那就太没意思了

到此为止,简单的查找就搞定了。至于替换功能,看了下一个例子,我相信你就可以触类旁通轻松搞定了。

Study Case 4:高亮显示

上一个例子中我们学会了查找文本——究跟到底,对Web页面还是只读不写。那么,如果说要把所有的搜索结果高亮显示呢?我们很快会想到把所有匹配的文字颜色、背景改一下就可以了。

首先想到的可能是直接修改HTML文本吧……但是,与SourceCode的高亮显示不同,我们需要并且只需要高亮页面中的文本部分。HTML标签、脚本代码等等是绝对不应该去改动的。因此我们不能把整个页面的Source Code读进来然后replace,那样有破坏HTML文件结构的可能;我们只能在能够分离出文本与其他内容(标签,脚本……)的前提下进行。

具体方法有很多,下面提供两个比较简单的方法。

方法一:使用TextRange(IHTMLTxtRange)
有了上一个Case的基础,相信大家立刻会想到使用TextRange。没错,TextRange除了提供查找方法之外,还提供了一个pasteHTML方法,以指定的HTML文本替换当前TextRange中的内容。代码片断如下:

publicpartialclass HilightDemo:Form
{
//定义高亮显示效果的标签。
stringtagBefore="<spanstyle='background-color:yellow;color:black'>" ;
stringtagAfter="</span>" ;

//……

privatevoidbtnHilight_Click(object sender,EventArgse)
{
HtmlDocumenthtmlDoc= webBrowser.Document;
stringkeyword= txtKeyword.Text.Trim();
if (keyword == "")
return;

objectoTextRange=htmlDoc.Body.InvokeMember("createTextRange" );

mshtml.IHTMLTxtRangetxtrange=oTextRangeas mshtml.IHTMLTxtRange;

while(txtrange.findText(keyword,4 ))
{
try
{
txtrange.pasteHTML(tagBefore+keyword+ tagAfter);
}
catch {}
txtrange.collapse(false );
}
}
}


※这段代码里获取IHTMLTxtRange的方式和上面的例子稍稍不同,其实所谓条条大路通罗马,本质是一样的。

方法二:使用DOM(文档对象模型)
将HTML文档解析为DOM,然后遍历每个节点,在其中搜索关键字并进行相应替换处理即可。

publicpartialclass HilightDemo:Form
{
//……

privatevoidbtnHilight_Click(object sender,EventArgse)
{
HTMLDocumentdocument= (HTMLDocument)webBrowser.Document.DomDocument;
IHTMLDOMNodebodyNode= (IHTMLDOMNode)webBrowser.Document.Body.DomElement;
stringkeyword= txtKeyword.Text.Trim();
if(keyword=="" )
return ;

HilightText(document,bodyNode,keyword);
}

privatevoidHilightText(HTMLDocumentdocument,IHTMLDOMNodenode,string keyword)
{
//nodeType=3:text节点
if(node.nodeType==3 )
{
stringnodeText= node.nodeValue.ToString();
//如果找到了关键字
if (nodeText.Contains(keyword))
{
IHTMLDOMNodeparentNode= node.parentNode;
//将关键字作为分隔符,将文本分离,并逐个添加到原text节点的父节点
string[]result=nodeText.Split(newstring []{keyword},StringSplitOptions.None);
for(inti=0;i<result.Length-1;i++ )
{
if(result[i]!="" )
{
IHTMLDOMNodetxtNode= document.createTextNode(result[i]);
parentNode.insertBefore(txtNode,node);
}
IHTMLDOMNodeorgNode= document.createTextNode(keyword);
IHTMLDOMNodehilightedNode=(IHTMLDOMNode)document.createElement("SPAN" );
IHTMLStylestyle= ((IHTMLElement)hilightedNode).style;
style.color="black" ;
style.backgroundColor="yellow" ;
hilightedNode.appendChild(orgNode);

parentNode.insertBefore(hilightedNode,node);
}
if(result[result.Length-1]!="" )
{
IHTMLDOMNodepostNode=document.createTextNode(result[result.Length-1 ]);
parentNode.insertBefore(postNode,node);
}
parentNode.removeChild(node);
}//EndofnodeText.Contains(keyword)
}
else
{
//如果不是text节点,则递归搜索其子节点
IHTMLDOMChildrenCollectionchildNodes=node.childNodesas IHTMLDOMChildrenCollection;
foreach(IHTMLDOMNodenin childNodes)
{
HilightText(document,n,keyword);
}
}
}
}

(编辑:新余站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读