秋枫思语

Keep It Simple and Stupid.

郑佐ID:zhzuo
382142次访问,排名133好友0人,关注者100
http://hi.csdn.net/zhzuo
zhzuo的文章
原创 74 篇
翻译 5 篇
转载 1 篇
评论 524 篇
秋枫的公告
本站文章只代表作者某一时期的观点,对于其正确性没有任何假设或担保。
最近评论
wjcing:你好,关于"六如居士"的问题:"Connection.GetOleDbSchemaTable获得了数据库的架构信息,但字段类型是用130这样的形式来表示的,而且nchar、nvchar、ntext都是用130表示,请问你对这个情况了解吗?如何解决这个问题?
"

和MySQl 如何获取的...我也想知道...
我的邮箱:ufonet@163.co……
zhzuo:ericshen030283@yahoo.com.cn,
请查收邮件。
nicholsky:不错,学习下,就是不断调用模态窗体发现内存不断增加,基本不会降下来,点10多次后,大得无法想像。
sy030283:感谢,但代码好像下载不了,博主可否发一份代码:ericshen030283@yahoo.com.cn
hanzhongdan:谢谢,继续学习
文章分类
收藏
    相册
    Work & Life
    存档
    订阅我的博客
    XML聚合  FeedSky

    翻译 在IE浏览器中使用Windows窗体控件[翻译]收藏

    新一篇: 在DataGrid中使用下拉列表框和设置焦点[翻译] | 旧一篇: 在C#中调用VBScript和JavaScript等脚本的实现

    在IE浏览器中使用Windows窗体控件
    作者:Thiru Thangarathinam
    翻译:郑佐
    日期:2004-05-10
     
    引言
    在过去,Web程序员经常在他们的Web程序中使用ActiveX控件来实现一些胖客户端才具有的功能。不过现在开发者可以很容易的通过Microsoft.NET Framework来简洁和安全的建立对象,并且方便的在IE浏览器中切入使用。通过在IE浏览器中创建Windows窗体控件,开发者可以实现丰富的web客户端。在这篇文章中,我们将会知道怎样创建Windows窗体控件并且在IE中使用。在浏览器中使用窗体控件过程中,我们会演示怎样通过窗体控件来提供丰富的web客户端显示,而窗体控件用来调用远程Web service获取数据。与此同时,我们也会知道怎样利用.NET安全模型来为我们的窗体控件提供一个安全的运行环境。
    如果你有过用Java开发Web程序的经验,那你会很熟悉Java applets。它是一个运行在浏览器中的一个小程序。当浏览器打开包含有Applet 标签的HTML文档时,Java applets就会运行。Windows窗体在web页里的工作方式同Java applets很相似。在这个实现中,你创建窗体控件,并为他加上丰富的Windows窗体控件样式,接着切入到Web页面中。在浏览器加载该Web页面的时候,Windows控件所包含的代码也会被执行。在局域网或者扩展的网络程序中这个将会是很有用的。比如想开发一个企业使用的具有胖客户端特性的基与web的程序。
    .NET的一个重要特征就是跟IE紧密结合。比如,我们可以在IE中使用Windows窗体控件,而不需要通知用户需要加另外的东西。这个不需要注册什么.NET CLR就会提供代码安全访问的能力。
    当你创建Windows窗体控件,你会有窗体类层次提供的特征。比如,你可以使用Windows窗体控件验证技术来验证输入数据的准确性。同样的,你甚至可以在你的窗体控件中调用Web Service。通过这些技术使用,你可以创建基与.NET平台的丰富的、健壮的、动态应用程序。
     
    备注:按照原文重写了代码,把载图替换成了中文,运行环境:操作系统windows2003,.NET Framework 1.1.这里讲几点:调试过程中打开浏览器输入完整地址。如果以文件方式打开将不会显示窗体控件;另外对于进程的调试,可以是单个源文件。不过我运行的是Debug版本下生成的组件,不是Release的,有兴趣读者可以试试。
     
    执行
    在这节,我们就会明白怎样创建Windows窗体控件并在IE中使用。下面列出了五个步骤来完成这一过程。
        1.创建Windows窗体控件
        2.创建一个带有object 标签的HTML文档,该标签用来标识Windows控件
        3.配置控件的虚拟路径
        4.设置代码访问权限
        5.运行控件
    接下来让我们来看看上面的各个步骤。
    1.创建一个windows窗体控件
    在这一步中,我们创建一个简单的Windows窗体控件。控件实现的功能是显示”Hello World”给用户。我们先来建立一个Windows 控件库项目取名为HelloWorldControl,修改默认的用户控件为HelloWorldCtl。接着在控件中加入一个Label,取名为lblDisplayMessage,同时增加了一个按钮btnClick。当用户点击按钮时,将会执行下面的代码用来显示消息给用户。
    private void btnClick_Click(object sender, System.EventArgs e)
    {
        this.lblDisplayMessage.Text = "Hello World";
    }
    接着就是编译他生成一个Assembly。
    2.创建HTML页
    在这一步中,我们将创建一个HTML文档并在里面插入object标签。整个文档看起来如下:
    <html>
    <body>
    <p>Hello World Control
    <br>
    <br>
    </body>
    <object id="HelloWorldControl1"
    classid="http:HelloWorldControl.dll#HelloWorldControl.HelloWorldCtl"
    height="500" width="500" VIEWASTEXT>   
    </object>
    <br>
    <br>
    </html>
    在这个标签的classid 属性中,我们指定第一步创建的那个组件的路径以及组件完整限定名。整个完整名称包括命名空间和整个类名。我们可以在上面的代码中清楚的看到组件名和限定名用#分割。这两部分参数组合在一起用来标识控件的唯一性。当然可以通过取名唯一id为HelloWorldControl1来编写客户端脚本。
    3.配置虚拟路径
    有了HTML页面,现在来建立一个HelloWorldControlHost的虚拟目录,实际目录在D:\My Programs\HellpWorldHost,该目录包含了HelloWorldControl.dll和Hellpworld.htm文件。当设置虚拟目录的时候,需要注意的是设置执行权限为“纯脚本”。如果设置成“脚本和可执行脚本”的权限。那控件可能不会正常工作(我在IIS6下设置成“脚本和可执行脚本”,不正常)。你可以打开虚拟目录的属性来确认设置,设置窗口如下:
    attr
    4.设置代码访问权限
    如果这个web在局域网中访问,他会正常工作。如果该Web是通过Internet来访问,那你需要设置internet Explorer,修改安全属性以允许他运行。你可以把主页加入到受信任的站点。如果需要设置可以通过IE的工具菜单―>Internet选项->安全->受信任的站点,点击上面的站点按钮把你的网站加入其中。接下去,当你打开浏览器查看,就会看到正确执行。
    5.运行控件
    要运行这个控件,我们在浏览器中查看包含了控件的那个Html页面。假如你在页面上点击这个按钮,那么控件就会显示“Hellp World”信息,执行页面如下:
    helloworld
    在这个例子中,我们实现了怎样创建件一个Windows窗体控件然后在IE浏览器中显示。在下一节中我们来实现在客户端浏览器上通过窗体控件来访问Web Service。
     
    通过windows窗体控件访问Web Service
    窗体控件一个重要优点就是你可以通过它在客户端实现丰富的用户信息。比如说,你可以通过窗体控件对Web服务的访问从而在IE中显示而不需要重新刷新该页面。为了演示这点,我们先来创建一个Web服务,接着再来演示怎样通过窗体控件调用Web服务。
    创建Web service
    我们创建一个 Visual C# Asp.net web service 新项目,名字取为AuthorsWebService。
    建立以后,我们修改服务类名称为AuthorsService,同时在类里面增加一个GetAuthors方法到里面,该方法的代码如下:
    [WebMethod]
    public DataSet GetAuthors()
    {
        string connString = System.Configuration.ConfigurationSettings.AppSettings["connectionString"];
        SqlConnection sqlConn = new SqlConnection(connString);
        DataSet dstAuthors = new DataSet("Authors");           
        SqlDataAdapter adapter = new SqlDataAdapter("Select * from Authors",sqlConn);      
        adapter.Fill(dstAuthors,"Author");     
        sqlConn.Close();
        sqlConn.Dispose();
        return dstAuthors;      
    }
    上面方法的代码比较简单,我们把数据库连接字符串储存到了Web.config文件的appSettings节点上,如下:
    <appSettings>
            <addkey="connectionString"value="server=localhost;uid=sa;pwd=thiru;database=Pubs"></add>
    </appSettings>
     
    上面代码中,我们创建了一个SqlConnnection实例,同时把上面的连接字符串作为参数传入。接着创建一个SqlDataAdapter对象,传入两个参数――查询字符串和SqlConnnection实例。调用SqlDataAdapter实例的Fill方法来执行数据库查询并把结果填充到DataSet。现在我们完成了Web服务的创建,接下去来建立一个他的一个客户端调用。
    创建windows窗体控件作为Web服务客户端
    在这里,我们是想用一个窗体控件来调用Web Service,因此新建一个Visual C#窗体控件项目取名AuthorsWebServiceClientControl:
    完成后,修改默认用户控件名称为AuthorsControl.。我们在上面添加了一个DataGrid控件取名GridAuthors 同时添加一个按钮取名BtnClick。注册按钮的点击事件,在事件处理函数中,将会调用WebService。在这之前我们需要添加项目的Web引用,输入刚才创建的Web服务地址。编辑器会生成该服务的代理,添加Web服务引用如下:
    serviceAdd
    服务代理创建以后,我们在按钮事件中添加代码:
    private void BtnClick_Click(object sender, System.EventArgs e)
    {
        this.Cursor = Cursors.WaitCursor;
        AuthorsWebServiceProxy.AuthorsService authorsSvc = new
            AuthorsWebServiceProxy.AuthorsService();
        this.GridAuthors.DataSource = authorsSvc.GetAuthors();
        this.Cursor = Cursors.Default;
    }
    在上面代码中,我们创建了web服务代理的一个实例,并调用GetAuthors方法把返回的数据集赋值给GridAuthors的DataSource属性。接着编译这个窗体控件,然后配置虚拟目录。
    创建Html页面和建立虚拟路径
    在这一步中,我们通过创建一个Html页面来使用上面创建的那个AuthorsWebServiceClientControl。下面是他的代码:
    <html>
    <body>
    <p>Authors Display Control
    <br>
    <br>
    </body>
    <object id="AuthorsControl1"
    classid="http:AuthorsWebServiceClientControl.dll#AuthorsWebServiceClientControl.AuthorsControl"
    height="500" width="500" VIEWASTEXT>   
    </object>
    <br>
    <br>
    </html>
    现在我们需要创建一个虚拟目录使该控件能正常工作,并把AuthorsDisplay.htm和AuthorsWebServiceClientControl.dll放在一起。打开该浏览器输入地址,你就会看到一个按钮和一个空的DataGrid,如果你点击该命令按钮,控件就会调用Web服务同时把结果写到了DataGrid中。页面结果如下所示。
    serviceShow
     
    调试窗体控件
     
    要调试窗体控件,你需要按照下面步骤进行。
        1.打开浏览器并请求包含窗体控件的那个Html页面。
        2.打开visual Studio.Net同时选择工具->调试进程就会显示下面的对话框。
    processDebuge
     
    在这个进程对话框中,选择IEXPLORE.EXE 点击附加按钮。当你点击附加按钮时会跳出一个对话框提示你选择要调试的程序类型。我们选择了Common Language Runtime 和Script两项,如下图:
    debug
     
    确定关闭上面的窗口和进程窗口。
        通过Vs.net的文件菜单打开用户控件文件 AuthorsWebServiceClient.cs,在源代码中设置断点。这样一旦你设置断点,你就可以调试该控件了,如下图所示。
    servedebuggs
     
    Windows窗体代码访问权限
    就象我们以前讨论的一样。当窗体控件在IE中执行时,他使用由.NET运行时提供的权限。要弄清楚控件怎样使用由.NET运行时提供的代码访问安全来在IE中运行,让我们回到前面,在窗体控件Load事件中加入下面的代码:
    private void AuthorsControl_Load(object sender, System.EventArgs e)
    {
        if (!EventLog.SourceExists("TestSource"))
            EventLog.CreateEventSource("TestSource", "TestLog");
        else
        {
            EventLog.DeleteEventSource("TestSource");
            EventLog.CreateEventSource("TestSource", "TestLog");
        }  
    }
    在上面的代码中我们判断web服务器上是否存在”TestLog”的日志源,如果不存在我们就创建他,如果存在就删除重建。就象你预料的一样,执行这些代码需要有更多的权限,所以上面的代码通过Internet该用户控件将不会正常工作,你将会看到如下的提示窗口。
    Secury
    通过上面窗口我们可以清楚的看到你的访问被.NET运行时所限制。
     
    在IE中使用窗体控件时,你需要意识到他的优点和局限。主要的优点包括:
    1.通过Web实现丰富的动态界面。
    2.无缝结合.NET的代码安全策略。
    3.优于Java applets的表现。
    限制包括:
    1.客户端需要是Windows操作系统
    2.需要IE6.0的支持
    3.客户端需要安装.NET运行时环境
    4.服务器端需要是Window2000和IIS5.0或者更高版本
    由于上面的限制,对客户端和服务器端数据的传输这也许也是有利的。比如说由于让Windows窗体控件在客户端IE中使用需要客户端安装有.NET runtime,我们可以写一些代码来判断客户机是否安装有.NET runtime,通过这一特征我们可以获得版本号,否则会得到0.0。
     
    结论
    在这篇文章中,我们讨论了怎样在IE中使用浏览窗体控件以及在进程中进行调试。同时也讲到了在IE中的.NET代码访问安全控制。
    虽然这项技术的实现需要客户端安装.NET运行时,不过我们可以相信在以后的Windows操作系统中将会集成.NET framework,windows2003就是一个很好的例子。
    最后,我希望你会发现这篇文章对你有所帮助,同时谢谢你的阅读。
     
    About the Author
    Thiru has almost six years of experience in architecting, designing, developing and implementing applications using Object Oriented Application development methodologies. He also possesses a thorough understanding of software life cycle (design, development and testing).
    He is an expert with ASP.NET, .NET Framework, Visual C#.NET, Visual Basic.NET, ADO.NET, XML Web Services and .NET Remoting and holds MCAD for .NET, MCSD and MCP certifications.
    Thiru has authored numerous books and articles. He can be reached at thiruthangarathinam@yahoo.com.
     
     

    发表于 @ 2004年05月10日 12:17:00|评论(loading...)|收藏

    新一篇: 在DataGrid中使用下拉列表框和设置焦点[翻译] | 旧一篇: 在C#中调用VBScript和JavaScript等脚本的实现

    评论

    #LoveCherry 发表于2005-02-25 08:14:00  IP:
    TrackBack来自《在IE浏览器中使用Windows窗体控件 》

    Ping Back来自:blog.csdn.net
    #秋枫 发表于2005-03-17 09:23:00  IP:
    TrackBack来自《对以前的一些文章提供程序源代码》

    Ping Back来自:blog.csdn.net
    #lingyn 发表于2004-07-08 16:52:00  IP: 202.104.97.*
    好是好﹐如果在控件中又放上第三方控件﹐那就不能運行了﹐
    #lingyn 发表于2004-07-08 17:07:00  IP: 202.104.97.*
    在COM技朮中﹐就可以在網頁上標識GUID來下載ActiveX 控件運行﹐.NET在這點上是以上技朮的繼承。而且全部在.Net Framework支持下運下﹐比以前有些方便。
    但是﹐原來的ActiveX 控件在局網內下載運行﹐也可禁用﹐.NET 控件就不行了﹐這是不是安全性差了呢?
    由于不需要下載控件﹐只是在.NET Framework支持下運行﹐那么第三方控件就不能使用﹐而.NET提供的那些控件功能很有限﹐而這些在ActiveX 控件中就可以用﹐這是不是比以前的技朮還落后了呢?
    希望得到回復
    #秋枫 发表于2004-07-31 17:11:00  IP: 211.140.56.*
    我的理解是第三方的Assembly也是放在服务器端执行的,不需要在客户端进行copy一份,就好比是增加一个用户控件或组件,没有什么区别,最关键的就是需要客户端安装.net framework,也就是运行环境。lingyn兄如果测试过,就像你预计的出现问题不妨把测试的代码贴出来,大家研究一下。
    #FlashElf 发表于2004-08-05 00:18:00  IP: 222.33.36.*
    ﹐.NET 控件
    运行的权限和 java小程序一样 很安全的不可以读写本地文件等
    ﹐.NET 控件
    也是可以禁用的
    # 秋枫 发表于2004-09-15 10:50:00  IP: 222.64.190.*
    lingyn说的有道理,我这里嵌入第三方控件也不能正确显示
    # Captain 发表于2004-09-15 10:51:00  IP: 222.64.190.*
    秋枫,lingyn说的有道理,我这里嵌入第三方控件也不能正确显示
    #过客 发表于2004-10-17 10:38:00  IP: 60.17.128.*
    按照你提供的方法我的机器不能正常运行(看不见windows窗体)是什么原因呀?
    #dhz 发表于2004-10-25 15:40:00  IP: 218.64.44.*
    看不到这个控件
    #Leon 发表于2004-11-18 11:29:00  IP: 61.152.127.*
    看不到,是路径的问题!!该例中,dll和html页面实在同一个文件夹下的
    #fb 发表于2004-12-17 09:56:00  IP: 211.99.27.*
    看不见,是把dll和html放在一个文件夹下的
    #sdf 发表于2004-12-21 10:24:00  IP: 219.130.79.*
    客户端一定要装.Net框架.是吗?
    #lee 发表于2005-01-01 02:54:00  IP: 219.144.202.*
    楼上问的极是
    #冥 发表于2005-03-01 10:14:00  IP: 218.14.52.*
    請問如何在winform控件与asp.net之间交还数据呢?
    #运行不了啊 发表于2005-03-26 00:05:00  IP: 218.13.190.*
    调试不出来啊。。
    #cndsn 发表于2005-03-31 13:24:00  IP: 210.21.59.*
    调试显示不出来!!哪个环节的问题??
    #蜀夫 发表于2005-04-10 15:46:00  IP: 222.137.157.*
    老兄!!!太谢谢你了,我的正常显示,解决我一个大问题呢!
    #cxwzyh 发表于2005-04-17 21:39:00  IP: 218.13.188.*
    我调试不出来啊。。。各位高手,能否把源代码贴出来参考参考一下。
    #ninglng 发表于2005-06-09 00:11:00  IP: 61.186.252.*
    我的问题是,上面的实现,实际是下载到客户端运行的,而且在xp+sp2上不能运行。不明为何与楼主的不同。

    我在控件中实现打印,却无法访问资源。请问有解决的办法吗?

    谢谢

    ninglng@163.com

    qq: 84533116
    #秋枫 发表于2005-06-12 13:13:00  IP: 61.186.252.*
    客户端的安全设置是由影响,代码在这里
    http://blog.csdn.net/zhzuo/archive/2005/03/17/321820.aspx
    #aw511 发表于2005-06-14 11:01:00  IP: 61.186.252.*
    在我自己的机器上用的很好,一点问题都没有。
    但是在别人的机器上就什么都看不到。连那控件都没有出现。不知道是什么原因。
    并且用别的机器访问我的也看不到。

    请秋枫有空帮我看看

    MSN:aw511@hotmail.com
    #秋枫 发表于2005-06-15 08:24:00  IP: 61.186.252.*
    访问的机器上安装了.net framework没有?
    #aw511 发表于2005-06-15 11:24:00  IP: 61.186.252.*
    加我MSN了,绝对不是什么恶意,我被这个问题搞的很郁闷了.
    老大还让我今天就找出原因.现在是不知所措啊.
    #anythingbutgirl  发表于2005-06-18 10:58:00  IP: 61.186.252.*
    解决了在控件中放上第三方控件,不能運行的问题.还是受客户端的安全设置是由影响.
    #hatumei  发表于2005-08-02 10:59:00  IP: 61.186.252.*
    你好!看了你的Blog中关于Asp.net中调用Windows控件的文章我受益匪浅,非常感谢你提供这么好的资料。我现在遇到了一个问题:你给的调用方法是用<object>方式实现的,可我需要传递很复杂的参数,网页中还有复杂的数据库查询,靠这种方式无法满足需求,我需要在.cs文件中调用,我引用了该控件,编写相应调用并编译通过,但就是无法运行网页,出现托管信息提示。
    #hatumei 发表于2005-08-02 11:02:00  IP: 61.186.252.*
    直接从IE栏访问网页,控件区显示为空白
    # 发表于2005-09-16 10:07:00  IP: 211.100.21.*
    to hatumei :

    <OBJECT id="print1" classid="http:RemotePrint.dll#RemotePrint.PrintControl"
    VIEWASTEXT>
    </OBJECT>

    <script language="javascript">
    function GetPid(url){
    print1.SetUrl(url);//SetUrl是RemotePrint.PrintControl的public方法
    alert(print1.GetUrl());
    }

    以上方法是否对你有启发?
    </script>
    #wandesu 发表于2006-02-20 16:19:00  IP: 218.18.207.*
    在默认网站(80端口)中调试正常,但在其他端口(如1001)则不行,请问是什么原因啊?谢谢!
    #掌声随便 发表于2006-03-28 19:43:00  IP: 222.209.51.*
    读了你的《在IE浏览器中使用Windows窗体控件[翻译]》很受启发,由于同时读了microsoft下的使用的相关技术文章,做了windows窗体的控件,想使用在ie下,但是放上去之后是一片空白,所以向你问下:这个是什么原因?需要怎样配制。谢谢。Msn:zhouhaiquan2003@163.com
    qq:68659670
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 秋枫