winform里面网页显示指定内容
今天有个同事问了一下我,怎么在winform里面打开网页啊?我们都是基于C/S的开发,很少接触winform,所以我当时就懵了,实在不知道怎么回答,所以索性说不知道。但是我又想了想,这个应该是个很简单的功能,趁着今天工作不是很忙,我就研究一下吧。
首先,新建一个winform项目,我在想,如果想要实现打开网页功能的话,应该会有一个控件什么之类的吧?查了工具栏,真的有一个名叫 WebBrowser的家伙,应该就是这货没错了。在网上查了它的资料更加坚定了我的判断,二话不说,拖进Form里。接着,就是要显示一个网页了,要怎 么实现呢?继续查看WebBrowser都有啥属性和方法:
方法
|
说明
|
GoBack | 相当于IE的“后退”按钮,使你在当前历史列表中后退一项 |
GoForward | 相当于IE的“前进”按钮,使你在当前历史列表中前进一项 |
GoHome | 相当于IE的“主页”按钮,连接用户默认的主页 |
GoSearch | 相当于IE的“搜索”按钮,连接用户默认的搜索页面 |
Navigate | 连接到指定的URL |
Refresh | 刷新当前页面 |
Refresh2 | 同上,只是可以指定刷新级别,所指定的刷新级别的值来自RefreshConstants枚举表, 该表定义在ExDisp.h中,可以指定的不同值如下: REFRESH_NORMAL 执行简单的刷新,不将HTTP pragma: no-cache头发送给服务器 REFRESH_IFEXPIRED 只有在网页过期后才进行简单的刷新 REFRESH_CONTINUE 仅作内部使用。在MSDN里写着DO NOT USE! 请勿使用 REFRESH_COMPLETELY 将包含pragma: no-cache头的请求发送到服务器 |
Stop | 相当于IE的“停止”按钮,停止当前页面及其内容的载入 |
属性
|
说明
|
Application |
如果该对象有效,则返回掌管WebBrowser控件的应用程序实现的自动化对象(IDispatch)。如果在宿主对象中自动化对象无效,这个程序将返回WebBrowser 控件的自动化对象 |
Parent | 返回WebBrowser控件的父自动化对象,通常是一个容器,例如是宿主或IE窗口 |
Container | 返回WebBrowser控件容器的自动化对象。通常该值与Parent属性返回的值相同 |
Document |
为活动的文档返回自动化对象。如果HTML当前正被显示在WebBrowser中,则 Document属性提供对DHTML Object Model的访问途径 |
TopLevelContainer | 返回一个Boolean值,表明IE是否是WebBrowser控件顶层容器,是就返回true |
Type |
返回已被WebBrowser控件加载的对象的类型。例如:如果加载.doc文件,就会返 回Microsoft Word Document |
Left | 返回或设置WebBrowser控件窗口的内部左边与容器窗口左边的距离 |
Top | 返回或设置WebBrowser控件窗口的内部左边与容器窗口顶边的距离 |
Width | 返回或设置WebBrowser窗口的宽度,以像素为单位 |
Height | 返回或设置WebBrowser窗口的高度,以像素为单位 |
LocationName |
返回一个字符串,该字符串包含着WebBrowser当前显示的资源的名称,如果资源 是网页就是网页的标题;如果是文件或文件夹,就是文件或文件夹的名称 |
LocationURL | 返回WebBrowser当前正在显示的资源的URL |
Busy |
返回一个Boolean值,说明WebBrowser当前是否正在加载URL,如果返回true 就可以使用stop方法来撤销正在执行的访问操作 |
事件 | 说明 |
---|---|
BeforeNavigate2 | 导航发生前激发,刷新时不激发 |
CommandStateChange |
当命令的激活状态改变时激发。它表明何时激活或关闭Back和Forward 菜单项或按钮 |
DocumentComplete | 当整个文档完成是激发,刷新页面不激发 |
DownloadBegin | 当某项下载操作已经开始后激发,刷新也可激发此事件 |
DownloadComplete | 当某项下载操作已经完成后激发,刷新也可激发此事件 |
NavigateComplete2 | 导航完成后激发,刷新时不激发 |
NewWindow2 | 在创建新窗口以前激发 |
OnFullScreen |
当FullScreen属性改变时激发。该事件采用VARIENT_BOOL的一个输 入参数来指示IE是全屏显示方式(VARIENT_TRUE)还是普通显示方式(VARIENT_FALSE) |
OnMenuBar |
改变MenuBar的属性时激发,标示参数是VARIENT_BOOL类型的。 VARIANT_TRUE是可见,VARIANT_ FALSE是隐藏 |
OnQuit | 无论是用户关闭浏览器还是开发者调用Quit方法,当IE退出时就会激发 |
OnStatusBar | 与OnMenuBar调用方法相同,标示状态栏是否可见。 |
OnToolBar | 调用方法同上,标示工具栏是否可见。 |
OnVisible | 控制窗口的可见或隐藏,也使用一个VARIENT_BOOL类型的参数 |
StatusTextChange | 如果要改变状态栏中的文字,这个事件就会被激发,但它并不理会程序是否有状态栏 |
TitleChange |
Title有效或改变时激发 |
看了以上信息后,Navigate这个方法最靠谱,所以在Form1_Load中加入了一句代码:
webBrowser1.Navigate("http://www.baidu.com/");
运行后百度的页面出来了,搞定!原来如此简单!
这么一句就搞定了,我开始不满足于现状,我想查看一下生成baidu的网页源代码,有一个属性是:DocumentText,我想应该是这个,于是我在Form1_Load加了这么一句:
this.textBox1.Text = webBrowser1.DocumentText;
运行后,发现textbox里啥都没显示,调试发现webBrowser1.DocumentText居然是空值,难道是我 DocumentText不是显示页面内容的属性?不对,我再加入webBrowser1.Document来调试,发现居然是个null值,一定是哪里 弄错了!
我仔细检查了一下,原来是我看事件不仔细,webBrowser1.DocumentText这个必须放在webBrowser1_DocumentCompleted事件中,等页面加载完成后,才能获取到网页的值,再试一下,果然成功了!
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
this.textBox1.Text = webBrowser1.DocumentText;
}
不过……为什么会有乱码啊?!
不行,我要把乱码去掉,默认是utf-8的页面,我只要把它转换成gb2312即可,所以就不能直接webBrowser1.DocumentText,我打算采用StreamReader来转换好一些:
StreamReader getReader = new StreamReader(this.webBrowser1.DocumentStream, Encoding.GetEncoding("gb2312"));
this.textBox1.Text = getReader.ReadToEnd();
OK,两句就搞定!注意哦,我这里用的是this.webBrowser1.DocumentStream
我又突发奇想,如果我只想要获取网页中的图片地址该怎么办咧?大概的思路就是从生成的网页源代码里找到img标签,并从src里取出来呗,于是有了以下代码:
StreamReader getReader = new StreamReader(this.webBrowser1.DocumentStream, Encoding.GetEncoding("gb2312"));
ArrayList list = new ArrayList();
string strRegex = "<img (.|\n)+?>";
Regex regex = new Regex(strRegex, RegexOptions.IgnoreCase);
MatchCollection match = regex.Matches(getReader.ReadToEnd());
int startp, endp;
for (int i = 0; i < match.Count; i++)
{
bool flag = false;
string Img = match[i].ToString();
startp = Img.ToLower().IndexOf("src=\"");
if (startp != -1)
{
startp = startp + 5;
endp = Img.ToLower().IndexOf("\"", startp + 1);
Img = Img.Substring(startp, endp - startp);
foreach (string str in list)
{
if (Img == "str" || Img == "/" || Img == "")
{
flag = true;
break;
}
}
if (!flag)
{
this.textBox1.Text += Img.ToString() + "\r\n";
}
}
}
输出以下结果:
http://www.baidu.com/img/shouye_b5486898c692066bd2cbaeda86d74448.gif
http://www.baidu.com/cache/global/img/gs.gif
虽然是成功取出了图片地址,但是感觉总是写这么多代码,有点不妥,这样一种取图片的功能,我想应该是很多人都会有这种需求,应该有啥控件或插件之类的吧?再网上搜了一下,果然让我找到了一个比较好用的——HtmlAgilityPack
把HtmlAgilityPack.dll引入项目后,只要编写如下代码就能实现如上的功能:
string strImg = "";
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(getReader.ReadToEnd());
foreach (var img in doc.DocumentNode.SelectNodes("//img"))
{
strImg += img.Attributes["src"].Value.ToString() + "\r\n";
}
this.textBox1.Text = strImg;


太强大了,我想HtmlAgilityPack这货的能力应该不仅仅如此,比如还可以用它来去脚本,去样式,和去注释等:
foreach (var script in doc.DocumentNode.Descendants("script").ToArray())
{
script.Remove();
}
foreach (var style in doc.DocumentNode.Descendants("style").ToArray())
{
style.Remove();
}
foreach (var comment in doc.DocumentNode.SelectNodes("//comment()").ToArray())
{
comment.Remove();
}
就是如此简单,写更少的代码,做更多的事!
好了,今天就研究到这吧,不然随着深入,我会越陷越深,工作都顾不上了,就此打住吧。对于HtmlAgilityPack我想以后有时间,我会详细研究它的。
总结一下:winform这东西,我几百年都没去碰过它,不过既然碰上了,就捣腾一番,写篇文章来记录一下当时我研究了啥,为啥研究,怎么研 究,以免以后忘了。对于新事物和新问题,我都是这么去解决的,不知道有没有人和我一样,躺着也中枪?以后还有好多东西要去学习和研究,努力,加油!正能量 爆发!!嘎嘎嘎!!!
工作去……
winform里面网页显示指定内容的更多相关文章
- gridView RowDataBound事件 鼠标经过行颜色变化及根据字段值显示指定内容
protected void gvBarInfo_RowDataBound(object sender, GridViewRowEventArgs e) { if ...
- javascript 随机显示指定内容
今天碰到一个需求,一个页面显示赞助厂商的信息,但是厂商要求排序要随机排,因为是个静态页面不是读取数据库的,所以打算用js来控制 var arr = new Array('张三', '李四', '王五' ...
- C# Winform 中webBrowser显示html内容时禁止错误提示的方法
在winform中有一个控件可以显示html的内容,该控件就是webbrowser,设置它的DocumenText属性为HTML的内容即可. 在使用WebBrowser做UI的时候,我们有时不希望里面 ...
- 只访问tomcat,不访问项目时,显示指定内容。
1.情景展示 我们知道,将javaWeb项目部署到tomcat后,访问该项目的url路径构成是: 网路协议+"://"+ip地址+":"+tomcat设定的 ...
- SendTextMessage如何打开记事本并显示指定内容
procedure TForm1.Button1Click(Sender: TObject); var hEdit: HWND; str: string; begin str := '准备要添加到记事 ...
- error_page 改变状态码为新的状态码,并显示指定内容
server { listen 80; server_name www.espressos.com; location / { root /data0/www/bbs; index index.htm ...
- WinForm中遇到Label要显示的内容太长,自动换行
很多朋友都会在开发WinForm中遇到Label要显示的内容太长,但却不能换行的问题.这里我总结了几种方法,供大家参考. 第一种是把Label的AutoSize属性设为False,手动修改Label的 ...
- javascript怎么获取指定url网页中的内容
javascript怎么获取指定url网页中的内容 一.总结 一句话总结:推荐jquery中ajax,简单方便. 1.js能跨域操作么? javascript出于安全机制不允许跨域操作的. 二.用ph ...
- JAVA中让Swagger产出更加符合我们诉求的描述文档,按需决定显示或者隐藏指定内容
大家好,又见面啦. 在前一篇文档<JAVA中自定义扩展Swagger的能力,自动生成参数取值含义说明,提升开发效率>中,我们探讨了如何通过自定义注解的方式扩展swagger的能力让Swag ...
随机推荐
- STL容器删除元素的陷阱
今天看Scott Meyers大师的stl的用法,看到了我前段时间犯的一个错误,发现我写的代码和他提到错误代码几乎一模一样,有关stl容器删除元素的问题,错误的代码如下:std::vector< ...
- Ranorex 5 发布,支持SAP、Oracle Forms、MS Dynamics等
Ranorex 5 发布,支持SAP.Oracle Forms.MS Dynamics等 http://blog.csdn.net/testing_is_believing/article/detai ...
- web通过ActiveX打印
最近做了一个activex控件,可以通过html页面动态设置报表文件的数据,控件里的报表是通过FastReport实现了,可以通过FastReport先把报表设置好.欢迎大家提意见 控件及Demo下载
- npm命令总结
统一切换到项目目录 安装redux :npm install -save redux 安装react-redux : npm install -save react-redux
- 转:C#中String类的几个方法(IndexOf、LastIndexOf、Substring)
String.IndexOf String.IndexOf 方法 (Char, Int32, Int32)报告指定字符在此实例中的第一个匹配项的索引.搜索从指定字符位置开始,并检查指定数量的字符位置. ...
- [转] VB之Val()函数的使用
在VB中,也许你或多或少会希望得到的数据转换成数字类型,数字类型既可以是整形,单精度,双精度,浮点数,只要是数字类型这个都可以使用,不过此函数只返回字符串中包含的数字,若第一个字符为字母或者非数字字符 ...
- codeforces B. Friends and Presents(二分+容斥)
题意:从1....v这些数中找到c1个数不能被x整除,c2个数不能被y整除! 并且这c1个数和这c2个数没有相同的!给定c1, c2, x, y, 求最小的v的值! 思路: 二分+容斥,二分找到v的值 ...
- django 快速实现登录
前言 对于web开来说,用户登陆.注册.文件上传等是最基础的功能,针对不同的web框架,相关的文章非常多,但搜索之后发现大多都不具有完整性,对于想学习web开发的新手来说不具有很强的操作性:对于web ...
- Pace.js – 超赞的页面加载进度自动指示和 Ajax 导航效果
在页面中引入 Pace.js 和您所选择主题的 CSS 文件,就可以让你的页面拥有漂亮的加载进度和 Ajax 导航效果.不需要挂接到任何代码,自动检测进展.您可以选择颜色和多种效果,有简约,闪光灯, ...
- SQL Server中的事务日志管理(5/9):完整恢复模式里的日志管理
当一切正常时,没有必要特别留意什么是事务日志,它是如何工作的.你只要确保每个数据库都有正确的备份.当出现问题时,事务日志的理解对于采取修正操作是重要的,尤其在需要紧急恢复数据库到指定点时.这系列文章会 ...