在C#中处理ActiveX控件事件

时间:2009-06-23 09:36:56

标签: c# events activex

我有一个ActiveX控件(一个OCX文件),它会引发一个事件。我想在C#中捕获该事件。我该怎么做呢?

我可以在JavaScript中捕获控件的事件,这是

的代码
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>New Page 1</title>
</head>
<body >
<script type="text/javascript" for="CRMCntrl1" event="NewCall(szCallID, szCallType, nCallStartTime, szCLI, szOtherInfo)">       
        document.getElementById("abc").innerHTML="CallID: " + szCallID + "</br>" +
            "CallType: " + szCallType + "</br>" + 
            "CallStartTime: " + nCallStartTime + "</br>" +
            "CLI: " + szCLI + "</br>" + 
            "OtherInfo: " + szOtherInfo + "</br>" ;

</script>
<p>
<object id="CRMCntrl1" classid="clsid:D26FE0DF-5CAC-44E4-AA7A-E1794D9634D1">
</object>
</p>
<div id="abc">
</div>
</body>
</html>

我想用C#做。所以我添加了控件的COM引用。它包含我在Form的类中实现的接口。在其中一个界面中有一个事件,我订阅了该事件,基本上它是我想要捕获的事件,但它没有被提升。

这是我的C#代码

// other namespaces here
using CRMCNTRLLib;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form, CRMCntrl
    {
        public Form1()
        {
            InitializeComponent();

            this.NewCall += new _DCRMCntrlEvents_NewCallEventHandler(this.OnNewCall);
        }

        public event _DCRMCntrlEvents_NewCallEventHandler NewCall;

        public void AboutBox()
        {
            MessageBox.Show("steadfast");
        }

        public void OnNewCall(string szCallID, string szCallType, int nCallStartTime, string szCLI, string szOtherInfo)
        {
            MessageBox.Show(szCallID + szCallType + nCallStartTime + szCLI + szOtherInfo);
        }
    }
}

2 个答案:

答案 0 :(得分:2)

从您的代码中看来,CRMCntrl是一个包含单个NewCall事件的界面。因此,如果您想实施该界面,那么您就是负责触发该事件而不是处理该事件的人。

要处理从ActiveX控件触发的事件,您需要使用实际控件的实例 - 即事件应该来自的地方。如果您使用设计器添加了控件,请尝试查找包含对您控件的引用的私有字段的名称。

不知何故,你需要改变这个:

this.NewCall +=
       new _DCRMCntrlEvents_NewCallEventHandler(this.OnNewCall);

到此:

myActiveXControl.NewCall +=
       new _DCRMCntrlEvents_NewCallEventHandler(this.OnNewCall);

其中myActiveXControl是控件的名称(也实现了提供事件的接口)。

答案 1 :(得分:1)

你发布的内容应该有效,除了......对于你对表单本身的定义你所做的事情看起来很有趣。您是从Form和CRMCntrl派生类Form1?这不会以您期望的方式创建控件实例。尝试在窗体上放置一个新的ActiveX控件实例,看看会发生什么。