C#开发Activex控件–与JavaScript的互调

实现了ActiveX控件之后,在网页上的使用方式一般为:

<object id="grid" classid="clsid:9661B223-6188-4849-B292-C7D9D8173E49" width="100%" height="100%">
</object>

注意不是:(下面这种方式,会导致无法触发JS接收事件的)!!!!!

<object id="grid" classid="clsid:9771B223-6188-4849-B292-C7D9D8173E49" width="100%" height="100%" />


通常情况下,我们在企业级的项目开发中,还需要将Activex控件与调用它的页面进行互调,否则Activex控件没有太大的用处。而互调则基本上都是由脚本语言来完成的。

首先看一下Javascript如何主动调用Activex控件。


通过Javascript,网页可以调用Activex控件内的公共方法和属性。

如在控件中设置的属性为:

复制代码

/// <summary>/// 总页数/// </summary>public string TotalPage
{      get { return totalPage; }      set { totalPage = value; }
}

复制代码


则在网页上可以通过下面的方式调用:

复制代码

<script type="text/javascript">    //获取页面参数    function getPara() {
        alert("总页数:"+ document.getElementById("grid").TotalPage);
    }</script>

复制代码


如在控件中设置方法为:

复制代码

/// <summary>/// 当选择模式为单选时,获取当前行的某一列的数据/// </summary>public string GetValue(string colName)
{    //***}

复制代码

则在网页上可以通过下面的方式调用:

复制代码

<script type="text/javascript">    //获取页面参数    function getPara() {
        alert("总页数:"+ document.getElementById("grid").GetValue("col1"));
    }</script>

复制代码

 

接着,我们来看在Activex控件中如何调用JavaScript。


本人用的方法是,在控件中触发事件,在网页中接收事件。

首先定义事件接口:

复制代码

public delegate void ControlEventHandler(string redirectUrl);/// <summary>/// 通过本接口向javascript暴露事件/// </summary>[Guid("9771B223-6188-4849-B292-C7D9D8173E49")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]public interface ControlEvents
{    //Add a DispIdAttribute to any members in the source interface    //to specify the COM DispId.
    [DispId(0x60020000)]    void OnClose(string redirectUrl);
}

复制代码


接着在Activex控件中继承接口,同时增加属性ClassInterface(ClassInterfaceType.AutoDual):

[ClassInterface(ClassInterfaceType.AutoDual),
    ComSourceInterfaces(typeof(ControlEvents))]


然后在控件内部定义事件:

public event ControlEventHandler OnClose;


最后在某个方法体内部触发事件:

private void listCustomer_DoubleClick(object sender, EventArgs e)
{    //****        OnDoubleClick(info.RowHandle);
}


控件部分的编码工作便结束了,剩下的就是在网页中调用:
调用方式也有两种
第一种调用方式:

复制代码

<script type="text/javascript">        //捕获双击事件        function grid::OnDoubleClick(value){
            alert(value);
        }</script>

复制代码


注意此种方式要求Javascript代码出现在Object引用之后。

第二种方式:

<script type="text/javascript" language="JavaScript" for="grid" event="OnDoubleClick(value)">
        alert(value);</script>


参考文章:
红马天下Activex系列:
(1)http://www.cnblogs.com/homer/archive/2005/01/04/86473.html
(2)http://www.cnblogs.com/homer/archive/2005/01/08/88780.html
(3)http://www.cnblogs.com/homer/archive/2005/01/26/97822.html

Michał Kosmala写的Create ActiveX in .NET Step by Step
http://www.codeproject.com/Articles/24089/Create-ActiveX-in-NET-Step-by-Step

转载请注明出处:http://www.cnblogs.com/yuanyee

Leave a Reply