该博客系转发自http://www.ityoudao.com/Web/Csharp_590_1779.html,感觉此文章讲的不错,遂转发和大家分享。

 

WebBrowser控件简介

WebBrowser控件由来以久,是一个ActiveX控件。以前可以通过COM引用并使用。但在.Net Framework 2.0以后,提供了WebBrowser控件的托管包装。托管包装使得在Windows窗体客户端中显示网页更为简便。

使用WebBrowser控件,可以模仿IE的功能进行Web访问,但不仅仅局限于此,还可以通过禁用默认的IE功能,从而将该控件用作简单的HTML文档查看器,甚至可以浏览office各种格式文档。

此外,WebBrowser支持DOM和文本两种方式修改其承载的内容。这一点意味着没有必要再把修改的HTML保存到临时文件,而是直接在内容中实现修改并显示,提高性能并节省临时文件资源消耗。

总而言之,我们可以通过种种方法,到达将Web控件和Windows窗体控件无缝地整合到一个应用程序中的目的。
利用WebBrowser浏览网页
浏览网页是WebBrowser的老本行,托管包装后的WebBrowser更加简便易用。主要几个方法如下:
Navigate(): 导航页面。与以前版本不同,可以只给定一个参数即可,即URI。
GoBack() / GoForward() / GoHome(): 向后/向前/回首页。 
Stop():Refresh(): 停止加载/刷新
以上几个主要方法是用于导航各个页面用的,但它们并不是永远生效。这些方法是否生效,取决于AllowNavigation属性,默认为true,允许导航。
Print():用于打印。

(1)WebBrowser中的Html文档模型

我们可以通过DOM或文本的形式返回当前WebBrowser中的HTML文档:
Document: DOM(文档对象模型)形式的对当前网页的HTML描述。
DocumentText: 文本形式的对当前网页的HTML描述。
DocumentStream: 流形式的HTML描述。
关于文本形式的没有什么好说的,它是最直接的HTML描述,但是难于动态修改,而相比之下DOM形式的HTML描述则灵活的多,可以任意添加、修改、删除任意节点。DOM对象模型主要元素有HtmlDocument, HtmlElement, HtmlNode, HtmlText等等,在此不再啰嗦了。

(2)WebBrowser与IE
默认情况下,WebBrowser控件功能于IE极其相似,提供基本功能。如:可以通过GoHome(),GoBack(),GoFoward(),Stop(),Refresh()来实现IE工具栏中的主页、向后、向前、停止、刷新;通过Navigate()来实现IE中的地址栏;通过设置IsWebBrowserContextMenuEnabled = true来实现IE右键菜单;通过设置WebBrowserShortcutsEnabled = true来实现IE的快捷键等等。
同样在某些特殊需要下,我们可能不希望WebBrowser的行为与IE一样,比如我们只是希望WebBrowser作为一个Html的显示器,在这种情况下可把AllowNavigate设置成false来阻止WebBrowser的导航功能;把IsWebBrowserContextMenuEnabled和WebBrowserShortcutsEnabled设置为false来阻止右键菜单和快捷键等等。从而阻止了WebBrowser的一些IE特性。

(3)WebBrowser中的脚本错误处理
当IE浏览器遇到时脚本错误,左下角会出现一个黄色图标,点击可以查看脚本错误的详细信息,并不会有弹出的错误信息框。但是WebBrowser控件则没有这么聪明,它会弹出错误信息框,使得程序显的很不友好,而且会让一些自动执行的程序暂停。虽然WebBrowser提供了ScriptErrorsSuppressed属性,经过尝试,结果是令人遗憾的,通过设置该属性可以解决部分问题,但不能彻底解决。在此探讨两种解决方案:一是通过截获WebBrowser.Document.Window.Error事件,并阻止WebBrowser继续处理错误来解决。如下:
//注册捕获控件的错误的处理事件

this.WebBrowser.Document.Window.Error +=
new HtmlElementErrorEventHandler(Window_Error);
//对错误进行处理
void Window_Error(object sender, HtmlElementErrorEventArgs e)
{
e.Handled = true; // 阻止其他地方继续处理
}

上面的方法可以解决大部分问题,但对于多个框架嵌套等等的情形还是不能很好的解决,于是只能自己动手封装一个MyWebBrowser了,然后用我们自己的MyWebBrowser来替代WebBrowser。如下:

public class MyWebBrowser : System.Windows.Forms.WebBrowser
{
private SHDocVw.IWebBrowser2 Iwb2;
protected override void AttachInterfaces(object nativeActiveXObject)
{
Iwb2 = (SHDocVw.IWebBrowser2) nativeActiveXObject;
Iwb2.Silent = true;
base.AttachInterfaces(nativeActiveXObject);
}
protected override void DetachInterfaces()
{
Iwb2 = null;
base.DetachInterfaces();
}
}

这种方法能能很好的解决问题,其实使用过非托管WebBrowser的朋友肯定看出来了,实际上是通过引用SHDocVw绕过托管代码,直接SHDocVw.IWebBrowser2.Silent = true,最原始的也是最有效的。
利用WebBrowser访问Office文件

刚刚说过浏览网页是WebBrowser的老本行,那么除了本行外,其实他还可以搞点兼职。我们知道,在.Net窗体中是不提供嵌入Office文档OLE控件的,如果希望嵌Office文档的话,一个可能的解决方案就是使用WebBrowser控件。
其实在IE中就可以嵌入Office文档,所以WebBrowser具有此功力也很正常,但它带来的效果确实不错。操作也很简单:
this.webBrowser1.Navigate(strFileName);
只此一句,WebBrowser就会以嵌入的形式打开Office文档(Word, Excel, PowerPoint,...)了,效果如下图:


使用 WebBrowser 控件时的注意事项

1、在NET 2.0下的Webbrowser控件是对Webbrowser COM组件的不完全封装。所以,在简便的同时也会出现这样或那样的问题。简便也是有代价的。

2、WebBrowser控件异步浏览到文档。在调用Navigate()时,该调用会在文档完全加载之前将控制权返回给应用程序。如果打算为所包含的文档实现自动操作,则必须在DocumentCompleted事件在文档完成加载后发出通知。或是通过IsBusy来判断当前WebBrowser是否正忙于加载其他文档。
然而,通过实践,问题却不是这么简单。一般情况下,当ReadyState属性变成READYSTATE_COMPLETE时,Webbrowser控件会通过触发DocumentCompleted事件来指示网页加载完毕。但当加载的网页包含frame时,可能会多次触发该事件,所以不能简单地通过它来判断网页加载完毕。并非每个frame都对应了一个DocumentCompleted事件,只有触发了DownloadBegin事件的frame才会有相应的DocumentCompleted事件。另外,最外层的frame总是最后触发DocumentCompleted事件。那么怎么准确的判断页面加载完毕了呢,以下为一方案:

int counter = 0 ; // 计数器
private void webBrowser_Navigated(object sender,

WebBrowserNavigatedEventArgs e){
counter ++ ;
}
private void webBrowser_DocumentCompleted(object sender,

WebBrowserDocumentCompletedEventArgs e){
counter -- ;

if (counter == 0){
// 加载完毕 
}
}

3、在一个项目中有多个WebBrowser控件并且每个控件都加载相同类型的Office文档(全都是Word或全都是Excel)时,会出现多种问题。最常见的问题发生在Office命令栏上(命令栏会被禁用)。如果在同一个窗体上有两个WebBrowser控件,且两个控件都加载Word文档,那么只有一组工具栏会是活动的,另外一个则被禁用,无法使用。所以,建议一个项目只使用一个控件,并且一次只浏览到一个文档。

4、要清除WebBrowser控件中的当前内容,使用下面的代码浏览到默认空白页:

this.webBrowser1.Navigate("about:blank");

转载于:https://www.cnblogs.com/xjt927/archive/2012/09/17/2688102.html

C#Winform中WebBrowser控件的特性和详细调用方法相关推荐

  1. C#中WebBrowser控件的使用

    今天在YouTube上看了一个关于WebBrowser控件用法的小视频,做一下总结. 首先创建一个WinForm程序,拖入一个textbox控件和一个button按钮,然后拖入一个panel控件,如图 ...

  2. C# winform中判断控件类型

    C# winform中对控件类型的判断: public void UpdataControl(Control control, string data) {if (control is TextBox ...

  3. Winform中Treeview控件失去焦点,将选择的节点设置为高亮显示 (2012-07-16 13:47:07)转载▼...

    Winform中Treeview控件失去焦点,将选择的节点设置为高亮显示 (2012-07-16 13:47:07)转载▼ 标签: winform treeview drawnode Treeview ...

  4. 使用WebBrowser控件获取网页源码的方法

    使用WebBrowser控件获取网页源码的方法,网上有很多介绍,但绝大多数的人都是使用以下的方法获取: (WebBrowser1.Document as IHtmlDocument2).body.ou ...

  5. android获取自适应高度,Android中oncreate中获得控件高度或宽度的实现方法

    Android中oncreate中获得控件高度或宽度的实现方法 onCreate函数只是提供了数据初始化的机会,此时还没有正式绘制图形.在图形尚未渲染的情况下,getWidth()或getHeight ...

  6. C# WinForm中 让控件全屏显示的实现代码

    夏荣全 ( lyout(at)163.com )原文 C#中让控件全屏显示的实现代码(WinForm) 有时候需要让窗口中某一块的内容全屏显示,比如视频播放.地图等等.经过摸索,暂时发现两种可行方法, ...

  7. c#中WebBrowser控件的使用方法

    首先先来简单介绍一下webbrowser控件,这个控件是可以实现在form窗体中添加网页内容的.如图,我在form中加入了百度api,(百度地图api调用博客里有讲) 使用这个控件其实很简单 (1)第 ...

  8. [转]ASP中ActiveX控件的内嵌及调用

    懂ASP(Active Server Pages)的人很多,但能用ASP自如地调用ActiveX控件的人却不多:如果不调用ActiveX控件,则可以说微软当初设计ASP的初衷根本没有达到.众所周知,A ...

  9. WinForm中日期控件开窗

    当我们在使用WinForm开发项目或者小工具的时候,很多时候需要做开窗事件,这个时候你会如何处理呢? 当然微软给我们提供了强大的日期控件,我们可以通过下拉选择来选择相应的日期,但是你会发现日期的格式不 ...

最新文章

  1. 创建属于自己的调色板
  2. “金三银四”跳槽需谨慎(送福利礼包)!
  3. linux主节点启动nfs,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  4. PropertyPathFacoryBean获取对象的值
  5. Vasya and Multisets CodeForces - 1051C 模拟|分类讨论
  6. OpenCv学习笔记(二)—cv Mat学习
  7. [转] FFmpeg常用基本命令
  8. Tricks(十八)—— 转置 list of lists
  9. miui 8.5 android,小米MIUI8.5稳定版
  10. 广东神州行如何拨打长长途才实惠?
  11. 复利单利计算0318
  12. 冷库用电量计算机方式,冷库一般用电量如何估算
  13. php GD库做水印功能,合并图片
  14. 城市交通大脑的内涵与顶层设计
  15. Scrapy: 为什么xpath和css明明是对的,但却爬不到任何内容?
  16. 选择 Go 还是 Rust?CloudWeGo-Volo 基于 Rust 语言的探索实践
  17. 移动优盘linux系统下载,把Linux装进U盘 打造简洁移动系统
  18. 甜橙金融敏捷实践之路--零售金融
  19. win7通过esayBCD安装ubuntu14.04
  20. caffe中LOG(INFO) DLOG(INFO)介绍(统称Google glog)

热门文章

  1. GlobalAuthenticationConfigurerAdapter.class 整合activiti 工作流报错
  2. 图像锐化拉普拉斯算子matlab,Matlab图像锐化-Sobel,Laplacian算子 实验教程
  3. 计算机建模报告,计算机三维建模及分析实验报告单.doc
  4. squid端口转发_Squid服务器三种代理方式详解
  5. 收集:Hibernate中常见问题 No row with the given identifier exists问题的原因及解决
  6. python编程英语单词怎么写_用Python写一个背英文单词程序
  7. 大数据与商业地理分析
  8. java 定义接口school_Java接口介绍
  9. python3怎么安装mysql_Python3.7安装mysqlclient
  10. 用matlab画声偶级辐射,matlab结题报告(电偶极子的辐射场)