• 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

    --------------------------------------

    欢迎您,进入 我系程序猿 的cnBlog博客。

    你不能改变你的过去,但你可以让你的未来变得更美好。一旦时间浪费了,生命就浪费了。

    You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.

    --------------------------------------

    分享到QQ空间  

  • 相关阅读:
    【leetcode】496. Next Greater Element I
    工具网站
    [err]Traceback (most recent call last): File "/usr/local/bin/pip", line 7, in <module> from pip._internal import main ImportError: No module named 'pip._internal'
    []TLD code run
    【动手学深度学习】
    【论文阅读】Wing Loss for Robust Facial Landmark Localisation with Convolutional Neural Networks
    【linux基础】ubuntu系统NVIDIA驱动安装
    【linux基础】linux不能进入系统
    【leetcode】492. Construct the Rectangle
    【leetcode】485. Max Consecutive Ones
  • 原文地址:https://www.cnblogs.com/jqmtony/p/2910822.html
Copyright © 2020-2023  润新知