其实我这个问题本身就提得有些模糊.你想知道的是两个工程之间的交互还是,在IE中使用winform控件,或是在winform中访问IE呢?
http://www.66study.com/Article/web/net/VB/200506/50514.html
http://blog.csdn.net/Qqwwee_Com/archive/2005/11/05/523395.aspx(应用了WebBrowser控件)
http://www.tldown.com/article/article_14859_1.html
http://blog.joycode.com/lostinet/archive/2004/06/04/23638.aspx
结合 MSHTML 与 WebBrowser 生成美观实用的 WinForm 应用程序。
我用WinForm开发也有一段时间了。我觉得目前的WinForm开发速度是够的,但是一些原本在HTML就很容易做到的事情,在WinForm中就很难实现了。
这个主要的原因可能是WinForm复用控件的能力非常强,但是可用的控件却非常少。一般买回来的控件不但贵,而且也不是太好扩展。
作为一个学了多年HTML的人,我当然希望在WinForm中依然能使用HTML的特征,例如强大的CSS!,自动排版伸缩的特征,(CSS与排版可以更方便打印!),以及脚本的编写。(有时候写脚本比写WinForm的程序更爽。具体情况具体做)。
要做这个其实不难。但是要灵活运用则不容易了。
通常,使用WebBrowser控件的人,只是简单地使用MSHTML调用WebBrowser里的东西。也就是说,这个调用是单项的,只考虑到修改HTML来显示某种东西。
今天我写这个随笔的意图是告诉大家怎样把用户在WebBrowser里的操作反馈给WinForm 。
做这个反馈的基石是 DotNet 的 InteropServices 。通过把DotNet的某个对象,传到HTML
DOM里去,然后用脚本来操作该DotNet对象。
要做到这个,核心是:
获取 WebBrowser.Document ,它实现了mshtml.IHtmlDocument /2/3/4/5
(其中IHtmlDocument2最有用)
这个Document是
System.Runtime.InteropServices.Expando.IExpando,通过它来设置和获取Document的一些动态命名的成员。
例子中的代码是:
mshtml.IHTMLDocument2 doc2=(mshtml.IHTMLDocument2)browser.Document;
System.Runtime.InteropServices.Expando.IExpando
ex=(System.Runtime.InteropServices.Expando.IExpando)doc2;
System.Reflection.PropertyInfo piform1=ex.AddProperty("Form1");
piform1.SetValue(doc2,this,null);//从此,在HTML的document.Form1就是这个WinForm的Control了。你可以用脚本来调用Form1
!
有了这些交互,我们可以实现的东西实在太多太多了。
我做了一个简单的例子,在这里下载 http://www.lostinet.com/files/WinHtml.zip
我下一步应该是研究一下,怎样直接把WinForm的Control动态地嵌进这个HTML里。(不是用 《 OBJECT 》来部署的形式)
2004年6月4日 11:26
反馈
# 回复: 结合 MSHTML 与 WebBrowser 生成美观实用的 WinForm 应用程序。 2004-6-4 12:50 Lostinet
例子中的window的获取是多余了.
因为我发现了
IHTMLDocument2.parentWindow
请问可否在webform和winform之间传递数据和命令 .NET技术 / ASP.NET - CSDN社区 community.csdn.net
请问可否在webform和winform之间传递数据和命令
xmouse () 2003-07-24 14:05:42 在.NET技术/ASP.NET提问
小弟想在asp.net和vc vb写的windows应用程序之间传递数据和命令
把asp.net做的web页面放在用winform中作为用户界面
请问各位 能不能把页面上的用户输入传到应用程序中去 并且对程序发出命令
最好程序也可以对页面发送命令 更新处理后的显示结果
Top
3楼 atian25 (阿天) 回复于2003-07-24 14:27:57 得分 0
你是在winform里面镶入webbrowser吗
To atian25(阿天) : 有此打算,我想嵌入web不是什么问题,交换数据发送命令比较难解决,如果后者不能实现,嵌入的问题我也不必考虑了。
Top
6楼 xmouse () 回复于2003-07-24 15:08:57 得分 0
因为程序还需要放在web上做服务,所以想使用web做用户输入界面,然后由winform来处理,并且返回给web
Top
8楼 atian25 (阿天) 回复于2003-07-24 16:17:14 得分75
文章标题:DotNet Form间数据传递
cancersyf aspxcn.com 2002-09-02
1. WebForm
l 利用System.Web Namespace 中 HttpResponse Class的Redirect方法传递,HttpRequest Class的
QueryString方法接收
传递来源类webform1 中的某个方法里 使用
Response.Redirect ("WebForm2.aspx?s=1&ss=11");
//HttpResponse 类的方法和属性通过 ASP.NET 的内部 Response 对象公开。
//所以Response可以使用前者的方法
传递目标类webform2 中
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
int loop1;
NameValueCollection coll;
//Load Form variables into NameValueCollection variable.
coll=Request.QueryString ;
//HttpRequest 类的方法和属性通过 ASP.NET 的内部 Request 对象公开。
// Get names of all forms into a string array.
String[] arr1 = coll.AllKeys;
for (loop1 = 0; loop1 < arr1.Length; loop1++)
{
Response.Write(arr1[loop1] + " = " + coll.GetValues(arr1[loop1]).GetValue (0) +"
");
}
}
//这样就列举了从webform1传递来的s & ss的值
l 这里要解释一下服务器端控件
, (我觉得)在asp.Net中它只是其他服务器端控件的容器,不能再像原来的asp那样可以使用action属性向其他页面提交数据。下面是MSDN原文:
ms-help://MS.VSCC/MS.MSDNVS.2052/cpgenref/html/cpconhtmlformcontrol.htm
注意 action 属性总是设置为页本身的 URL。无法更改 action 属性;因此,只能向页本身回送。
2. WindowsForm
l 利用form构造函数 Form()传递值.
Form Class 可以拥有多个构造函数,可以添加一个用来传值的构造函数,如下
public Form2()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
public Form2(int iii )
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
//这里添加一个label以显示传来的值
this.label1.Text= iii.ToString ();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
在打开form2的form1的某个方法里如下使用,可以把123传给form2
//WindowsApplication1是我的工程名
WindowsApplication1.Form2 frm2 = new WindowsApplication1.Form2(123);
frm2.Show ();
l 利用类的属性传值。
传递目标类form2 如下声明
private int i2 ;
public int iLen
{
get{return i2;}
set{i2=value;}
}
//这里添加一个label以显示传来的值
private void Form2_Load(object sender, System.EventArgs e)
{
this.label1.Text = this.i2.ToString ();
}
传递来源类form1如下使用
WindowsApplication1.Form2 frm2 = new WindowsApplication1.Form2 ();
frm2.iLen =1234;
frm2.Show ();
Top
9楼 zwztu (做自己想做的事) 回复于2003-07-24 16:34:15 得分5
为什么要传到winform中处理?直接在后台cs代码中处理不行吗?
Top
11楼 xmouse () 回复于2003-07-25 16:08:56 得分 0
To
zwztu(做自己想做的事:一来程序原来就是在winform写成的,后来想放到服务器上;再有,因为程序要进行大量数值运算,用webform直接写计算代码未必能胜任,而且我对webform的编程也不了解。
Top
12楼 xmouse () 回复于2003-07-25 16:11:53 得分 0
既然交换数据是可以解决的,回头再问原先的问题,马上就给分:把webform放到winform中去什么方法比较合适?
Top
15楼 xmouse () 回复于2003-07-26 09:39:00 得分 0
To atian25(阿天) :多谢多谢,我现在用MSW eb
Browser控件和DOM可以访问web中的每一个元素了,通过调用Navigate方法可以实现对web发送命令;可是反过来如何通过web对winform发送命令和获取数据我还是没明白,你的上面的代码好像是在winfrom和winform之间和传递的阿,还望指点!
Top
16楼 atian25 (阿天) 回复于2003-07-26 10:36:56 得分 0
你的web是镶入在win里面的吧?
对winform不是很熟
我最近那个项目我上面说了,通过webservies,如果想web控制win,通过web修改webservies,然后win读取。不知道这样是否满足你的要求
你想怎样个web控制win呢
Top
17楼 xmouse () 回复于2003-07-26 11:49:35 得分 0
web是嵌入到win的,用的是AxWebBrowser控件,我是想当用户在web中按钮可以引发win中的方法/函数/事件,就是这样的要求。
还有,我不清楚你说的通过web修改webservies的方法
大概是如何实现的阿
Top
19楼 atian25 (阿天) 回复于2003-07-28 13:20:32 得分 0
不好意思,昨天没看到帖子已经回了
好象为了安全,M$不让你的webform控制winform,用createobject也许能控制
先在webform里面创建一个你winform对象,然后控制吧(好象有点浪费资源)
或者把你winform中的需要被控制的部分写成控件
我说的有点不清楚,我的意思是webform中的asp.net可以通过webservies来修改一些
参数,然后用你的winform定时去读取,但这样的可行性我不知道好不好
我们那个是修改后台数据库。
评论