添加WebBrowser控件

private WebBrowser webBrowser1;
引用页面的document对象

HtmlDocument doc = webBrowser1.Document;//get web document
有了document对象,就可以像js一样操作doc,访问页面的所有对象。

HtmlElementCollection htmlElements = webBrowser1.Document.GetElementsByTag("input");//get all input elements
//access every input element in web form
foreach (HtmlElement el in htmlElements)
{
strInputName = el.GetAttribute("name").ToString();//get input element's name
strInputValue = el.GetAttribute("value").ToString();//get input element's value
}
winForm调用webpage的函数

/*web page function*/
<script>
function jsMethod(var jsParam)
{
alert(param);
}
</script>
/*call jsMethod from winForm*/
private void callJsMethod(string Param)
{
HtmlDocument doc = webBrowser1.Document;
doc.InvokeScript("jsMethod",new object[]{"called by winForm"});
}

webPage调用winForm方法

//winform code
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]//
[System.Runtime.InteropServices.ComVisibleAttribute(true)]//This property lets you integrate dynamic HTML (DHTML) code with your client application code
public partial class Form2 : Form
{
public void winFormMethod(string param)
{
MessageBox.Show(param);
}

private void Form2_Load(object sender, EventArgs e)
{
webBrowser1.ObjectForScripting = this;//important
}
}
//web page code
<input name="callWinMethod" onclick="window.external.winFormMethod('called from DHTML')">
要调用winform的方法,这两个属性是必须的
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
[System.Runtime.InteropServices.ComVisibleAttribute(true)]
还有必须设置webBrowser1.ObjectForScripting = this,被调用的方法是public的。
有了上面这些准备要实现一些简单应用就很简单啦,不妨自己动手试试。
实例一
下面结合一个简单例子,使用webbrowser自动登录。
先分析webform的结构,下面这个登录页面包括两个输入框:用户名和密码,以及一个登录按钮。

<HTML>
<HEAD>
<title>test html</title>
</HEAD>
<body background="/bugnet/graphics/back2.gif">
<form name="mainform" method="post" action="bugl_login.aspx" id="mainform" >
<b>Enter name</b><input id="uid" type="text" maxLength="50" size="25" name="uid"><br>
<b>Enter Password</b><input type="password" maxLength="20" size="25" name="pwd">
<input type="submit" value="go" name="go">
</form>
</body>
</HTML>
在页面载入webbrowser之后,程序自动填充用户名和密码,触发登陆按钮。

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{

string strUID = "userName@sdccn.com";
string strPWD = "PWD";
webBrowser1.Document.GetElementById("uid").InnerText = strUID;//fill name
webBrowser1.Document.GetElementById("pwd").InnerText = strPWD;//fill pwd
webBrowser1.Document.GetElementById("go").InvokeMember("click");//click go
}
自动登录就这样实现,利用这些可以完成一些重复登录工作,还可以使用来自动化测试webpage程序。

实例二
抓取页面数据,下面的页面有一个表格,如何把里面的数据提取出来?

看看页面DOM结构,一个table,三行两列

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>

<BODY>
<TABLE border=1>
<TR>
<TD>name</TD>
<TD>age</TD>
<TD>score</TD>
</TR>
<TR>
<TD>agan</TD>
<TD>18</TD>
<TD>99</TD>
</TR>
<TR>
<TD>asca</TD>
<TD>18</TD>
<TD>88</TD>
</TR>
</TABLE>
</BODY>
</HTML>
了解这个表格结构就可以开始导入到winform中的DataTable中,然后在DataGridView中展示出来

private DataTable ImportToDataTable()
{
HtmlElementCollection htmlTabs = webBrowser1.Document.GetElementsByTagName("table");//get all tables in the dom
DataTable dt = null;
DataRow dr = null;
string strValue = "";
int intII=0;
if(htmlTabs!=null&&htmlTabs.length>0)
{
HtmlElement htmlTable = htmlElements[0];
HtmlElementCollection htmlRows = htmlElement.GetElementsByTagName("tr");//get all rows
HtmlElementCollection htmlCells = null;
foreach (HtmlElement htmlRow in htmlRows)
{
if (htmlRow == htmlRows[0])//build table header
{
BuildHeader(ref dt, htmlCells)
}
else
{
htmlCells = htmlRow.GetElementsByTagName("td");

dr = dt.NewRow();
foreach (HtmlElement htmlCell in htmlCells)
{
if (htmlCell.InnerText!=null)
{
strValue = htmlCell.InnerText.Trim();
dr[intII++] = strValue;
}
}
dt.Rows.Add(dr);
}
}
}
return dt;

}

private void BuildHeader(ref DataTable dt, HtmlElementCollection htmlCells)
{
int intCols = htmlCells.Count;
if (dt == null)
{
dt = new DataTable();
for (int i = 0; i < intCols; i++)
dt.Columns.Add("col" + i, Type.GetType("System.String"));
}
}
例子对导入的数据简单的以string来处理,其实可以做一些深入处理,比如使用正则表达式识别不同的数据类型,希望这个例子能起到抛砖引玉的作用。

webBrower控件实现winform和webpage交互的更多相关文章

  1. webbrowser 控件实现WinForm与WebForm交互

    WebBrowser 控件可以让你装载Windows Form 应用程序中的 Web 网页和其它采用浏览器的文件.可以使用webbrowser 控件将现有的web框架控制项加入至 Windows Fo ...

  2. C# 网络编程之网页自动登录 (一).使用WebBrower控件模仿登录

    最近学习C#网络编程中,想实现网页自动登录并提交GET/POST信息,再实现循环登录不断发送报文给服务器,服务器发送消息给客户端记录能登录的账户和密码,做到后面实现绕过验证码.动态抓取登录位置等,但由 ...

  3. Halcon的HWindowControl控件在WinForm程序中的使用介绍(重点解决图片缩放的问题)

     Halcon的HWindowControl控件在WinForm程序中的使用介绍(重点解决图片缩放的问题) 2016-12-04 20:11 362人阅读 评论(4) 收藏 举报  分类: Halco ...

  4. C#常见控件与SQL Sever数据库交互

    C#常见控件与SQL Sever数据库交互 下拉框(ComboBox)与数据库绑定 首先,我们采用DataSet作为临时的数据库,这样会比较好 那么,我们先创建两个成员(对象) string sqlc ...

  5. 浏览器自动化的一些体会5 webBrowser控件之winform和webBrowser的交互

    从winform访问webBrowser,大致就是利用webBrowser提供的解析dom的方法以及用InvokeScript方法执行javascript.这个相对比较简单. 从webBrowser访 ...

  6. WPF控件--利用Winform库中的NotifyIcon实现托盘小程序

    WPF控件--NotifyIcon   运行界面如下所示:            图1                                             图2 代码很少,如下所示 ...

  7. 自己写的一个分页控件类(WinForm)

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; u ...

  8. jquery文件上传控件 Uploadify 可以和ajax交互

    http://www.cnblogs.com/mofish/archive/2012/11/30/2796698.html  原网址 基于jquery的文件上传控件,支持ajax无刷新上传,多个文件同 ...

  9. Winform控件WebBrowser与JS脚本交互

    1)在c#中调用js函数 如果要传值,则可以定义object[]数组. 具体方法如下例子: 首先在js中定义被c#调用的方法: function Messageaa(message) {       ...

随机推荐

  1. hdu 2838 Cow Sorting(树状数组)

    Cow Sorting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  2. 深入java并发Lock一

    java有像syncronized这种内置锁,但为什么还须要lock这种外置锁? 性能并非选择syncronized或者lock的原因,jdk6中syncronized的性能已经与lock相差不大. ...

  3. 使用注解实现 bean 转 csv

    csv 文件是 aaa,bbb,ccc aaa,bbb,ccc 保存 这里的要求是 List<T> 线性表的类型 转换成 类别似 html 中 table的格式,即第一行是 head 后面 ...

  4. Python使用时间戳

    1.将字符串的时间转换为时间戳 方法: a = "2013-10-10 23:40:00" 将其转换为时间数组 importtime timeArray = time.strpti ...

  5. ESXI主机打开shell后主机警告处理

    昨天为了配置snmp监控,将几台ESXI 5.5主机的shell 在控制台上从disable状态修改为enable状态后,登陆vcenter后,发现所有的主机都有警告. 处理过程如下: 选中有警告标志 ...

  6. 如何禁止使用teamviwer的使用

    前几天有人问我teamviwer怎么禁止,刚开始做实验的时候过滤了teramviwer.com解析出来的IP,可是还是没有用,其实将teamviwer登陆的服务器地址在路由器上过滤,teramviwe ...

  7. redis加入到Windows 服务

    1.cmd命令  安装命令: redis-server.exe --service-install redis.windows.conf --loglevel verbose  卸载命令:  redi ...

  8. TSL230选型

    tsl230是一种可以直接将光强转化成频率值的器件.详细原理就不介绍了,数据手冊里写的都非常清楚,230系列包括非常多种,主要为下面四类:TSL230,TSL230A,TSL230B系列:TSL230 ...

  9. 【Android UI】案例03滑动切换效果的实现(ViewPager)

    本例使用ViewPager实现滑动切换的效果.本例涉及的ViewPager.为android.support.v4.view.ViewPager.所以须要在android项目中导入android-su ...

  10. Kafka学习(一)配置及简单命令使用

    一. Kafka中的相关概念的介绍 Kafka是一个scala实现的分布式消息中间件,当中涉及到的相关概念例如以下: Kafka中传递的内容称为message(消息),message 是通过topic ...