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

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

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

</object>

注意不是:

<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

你可能感兴趣的:(JavaScript)