【Winform 控件浅谈 】 之 WebBrowser

前言

鄙人才疏学浅,如果说错了,还请各位不吝赐教

1.什么是 WebBrowser

下面是已有的轮子,我想说它们是专业的

http://baike.baidu.com/view/2981935.htm?fr=aladdin

http://msdn.microsoft.com/zh-cn/library/system.windows.forms.webbrowser(v=vs.110).aspx

2.用它做什么

除了可以访问/操作网页,或者是作为数据采集一种方案,我知识有限,难想到它还能干什么,欢迎指教

很多人肯定知道,采集应该用HttpWebRequest,或者什么 WebClient之类的,那个效率要高很多

确实,HttpWebRequest效率确实高很多,因为它请求一个Web Url 获取的都是Html字符串,不会加载你采集数据基本上用不上的东西

但是如果想做简单的Web Url客户端模拟,我觉得这个还是有他的用武之地的,为什么这么说,因为它会加载js啊,然后就没有然后了.

3.怎么用

1.拖/new

2.绑定事件

3.在事件里处理动作

详细内容请在本文后下载/查看源代码

4.一点扩展,什么是闭包,C#闭包

1.什么是闭包

闭包一词来自于Javascript

根据名字来看可以简单解释,封闭的包,简单来说就是一个匿名函数,在这个函数里可以定义变量,外部无法访问,可以用来延长外部变量的作用时间

2.C#闭包

        /// <summary>
        /// 绑定WebBrowser动作
        /// </summary>
        /// <param name="w"></param>
        /// <param name="pageObjects"></param>
        public static void xBinding(this W w, List<PageObject> pageObjects,object progress = null)
        {
            SetProgress(progress, P_MAX, pageObjects.Count);
            for (int i = 0, j = pageObjects.Count; i < j; i++)
            {
                var completedHandler = (new Func<int,PageObject, WebBrowserDocumentCompletedEventHandler>((index,po) =>
                {
                    return new WebBrowserDocumentCompletedEventHandler((sender, e) =>
                    {
                        bool temp = po.DoAction(sender as W) && SetProgress(progress,P_VALUE,index+1);
                    });
                })(i,pageObjects[i]));
                w.DocumentCompleted += completedHandler;
            }
        }

        private const string P_MAX = "Maximum";
        private const string P_VALUE = "Value";

        private static bool SetProgress(object p, string property, object value)
        {
            if (p != null && (p is ToolStripProgressBar || p is ProgressBar))
            {
                Type type = p.GetType();
                type.GetProperty(property).SetValue(p, value);
                return true;
            }
            return false;
        }

上面如果直接 new WebBrowserDocumentCompletedEventHandler 不用闭包的话,就会出现WebBrowser每次触发DocumentCompleted事件的时候,

如果在WebBrowserDocumentCompletedEventHandler 里面引用了 i ,那么i 会一直都是 pageObjects.Count - 1

5.一点思考,怎么用

实际上说这个我比较心虚,因为我用的时候都是在DocumentCompleted处理网页里面的内容

我不知道是否有更好的方法来做网页加载完后的事情

而且最让我烦恼的是代码看上去实在不敢恭维,如果我的DocumentCompleted里面要多个页面间的事情,我就得拼命的if else

这是一件让代码很不愉快的事情,代码都不愉快了,我还怎么和它做朋友呢

然后,然后,你可以看下代码

6.结语

WebBrowser有关的内容差不多我知道的就这些了

还有一个事情我忘记说了,就是在WebBrowser里面你也许想调用下自己的javascript 函数,或者网页里面的函数

但是 WebBrowser.Document 只有一个InvokeScript,这个不是那么灵活,可能是因为我还不够道行吧

也许你也可以跟我一样这样玩玩,也在代码里

        /// <summary>
        /// 执行脚本
        /// 请置于WebBrowser.DocumentCompleted 事件里执行,防止调用的内容未加载完
        /// </summary>
        /// <param name="w">需要执行脚本的WebBrowser对象</param>
        /// <param name="script">脚本</param>
        public static void xExecScript(this W w, string script, params object[] parameters)
        {
            w.Document.InvokeScript("eval", new object[] { string.Format(script, parameters) });
        }

你以为完了吗,还要等等,让我在啰嗦两句

网页加载完可能不是真的加载完了,也许你需要定时检查页面的元素,或者做一个类似Timeout的功能来执行某些动作

7.下载

http://files.cnblogs.com/lxmyn/MSolution.Stu.Win.WebBrowser.rar

这个是用VS2012开发的,当然我使用的是盗版,对此我深感愧疚,

如果你的VS版本低那么一点点或高一点,你也许可以,通过修改.csproj文件来打开项目

如果你的低太多,你也许得自己新建一个工程,然后把代码考进去,删除掉多余的using,以及自己手写替换掉不兼容的代码

时间: 2024-11-11 01:16:35

【Winform 控件浅谈 】 之 WebBrowser的相关文章

C# WinForm控件、自定义控件整理(大全)

转:http://www.cnblogs.com/top5/archive/2010/04/29/1724039.html 对C# WinForm开发系列收集的控件使用方面进行整理, 加入了一些文章, 不断补充充实, 完善这方面. 基础 - 常用控件 C# WinForm开发系列 - CheckBox/Button/Label/ProgressBar WinForm下CheckedListBox的数据绑定 Winform 下无闪烁走马灯效果实现 c#,winform,progressbar+la

.Net WinForm 控件键盘消息处理剖析

在WinForm控件上我们可以看到很多关于键盘消息处理的方法,比如OnKeyDown, OnKeyPress, ProcessCmdKey, ProcessDialogKey,IsInputKey等等,那么这些方法是如何被组织的,每一个方法的具体含义又是什么哪?Win32的键盘消息又是如何到达控件上的这些方法的,本文将着重阐述这些问题,对.Net WinForm控件的键盘消息处理过程进行剖析.  1.      WinForm消息循环 大家都知道WinForm也是依赖于底层的消息机制的,通常我们

通过WinForm控件创建的WPF控件无法输入的问题

今天把写的一个WPF程序发布到别的机器上执行,发现一个比较奇怪的问题:在那个机器上用英文输入法无法输入数字,非要切换到中文输入法才行:但在我的机器上却是好好的. 最开始以为是输入法的问题,弄了好一阵子后,终于找到了原因:虽然这个程序是个WPF程序,但为了复用之前的部分代码,使用着一个WinForm的菜单控件,后续的子窗口都是通过这个WinForm菜单创建的.而用WinForm控件创建的WPF控件可能出现无法正确响应键盘事件的情况. 找到了原因后,一个常规的解决方法是:将WinForm控件换成WP

C#中WinForm控件的跨线程更新Invoke

目的: 用WinForm(C#)搭建一个用户界面,一个进度条和一个按钮,按钮启动进度条,进度完成时停止更新 示例: 实现: 在按钮事件中设置循环,更新进度条         private void btnProgress_Click(object sender, EventArgs e)         {             for (int ii = 0; ii < 100; ii++)             {                 progressBar1.Value 

Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决

有人会说不建议Wpf中使用Winform控件,有人会说建议使用Winform控件在Wpf下的替代方案,然而在实际工作中由于项目的特殊需求,考虑到时间.成本等因素,往往难免会碰到在WPF中使用Winfrom控件的问题,我们知道Wpf可以通过使用WindowsFormsHost容器调用Winform控件,但是在一些场合需要将Wpf元素显示在Winform控件的上层,此时就会出现Wpf元素被Winform控件遮盖的问题. 一.场景再现 接到公司命令,在时间紧迫的情况下,需要将原来的Winform程序(

WinForm控件TreeView 只部分节点显示 CheckBox

WinForm控件TreeView 只部分节点显示  CheckBox 用过asp.net的应该知道,要在treeview中实现上述功能可以使用ShowCheckBox 属性指定那些节点显示checkbox哪些不显示,可是winform中的treeview只提供一个ShowCheckBoxes 属性,要么全部节点显示checkbox,要不全部不显示,而指定节点没有ShowCheckBox 属性,下面就在winform的treeview中实现BS对应CheckBox 属性的功能  方法1: a) 

WinForm控件复杂数据绑定常用数据源(对Combobox,DataGridView等控件DataSource赋值的多种方法)

开始以前,先认识一下WinForm控件数据绑定的两种形式,简单数据绑定和复杂数据绑定. 1) 简单数据绑定 简单的数据绑定是将用户控件的某一个属性绑定至某一个类型实例上的某一属性.采用如下形式进行绑定:引用控件.DataBindings.Add("控件属性", 实例对象, "属性名", true); 2) 复杂数据绑定 复杂的数据绑定是将一个以列表为基础的用户控件(例如:ComboBox.ListBox.ErrorProvider.DataGridView等控件)绑

c#Winform控件总结

1. C# WinForm控件.自定义控件整理(大全) (http://www.cnblogs.com/top5/archive/2010/04/29/1724039.html) 2. c#窗体控件用法大全 (http://blog.csdn.net/chenyingpy/article/details/6526541) c#Winform控件总结

在WPF中使用WinForm控件方法

1.      首先添加对如下两个dll文件的引用:WindowsFormsIntegration.dll,System.Windows.Forms.dll. 2.      在要使用WinForm控件的WPF窗体的XAML文件中添加如下内容: 即: xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" xmlns:wfi ="clr-namespace:System.Windo