【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,以及自己手写替换掉不兼容的代码

 

【Winform 控件浅谈 】 之 WebBrowser

上一篇:让Qt Creator支持Windows Phone 8开发


下一篇:在Springboot + Mybaitis-plus 项目中利用Jackson实现json对java多态的(反)序列化器