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

转载请注明出处:http://www.cnblogs.com/yuanyee
原文地址:https://www.cnblogs.com/yuanyee/p/2872232.html