我已经在SO上看到了一些与此相关的问题,但我认为我的情况完全不同,不会被视为重复(如果我错了,请告诉我)。
我有一个用C#编写的ActiveX控件,虽然我主要使用它,但我希望在点击时用JavaScript引发一个事件(它显示一个图像,因此它是页面上的一个可视元素)。
我想要完成的最终目标与<span>
标记没有什么不同,并且当标记的区域是onclick
时,它有一个<span>
事件来引发JavaScript函数点击。
关于它的大部分stuff I've read都详细介绍了如何处理ActiveX控件中的事件并来回发送信息,这很好,但看起来过于复杂。我不打算与ActiveX控件进行通信,我只需要一个JavaScript函数,当我点击它时会以类似于<div>
或<span>
标记的方式触发。我可以用JavaScript处理其他所有内容。简单地将控件包装在带有<div>
事件的onclick
或<script type="text/javascript" event="OnMouseClick(index)" for="AXObjectName">
<!--
AXObjectName_OnMouseClick(index);
//-->
</script>
中无效 - ActiveX控件几乎覆盖了它。
是否有一种简单的方法来处理用C#编写的ActiveX控件?
我想另一种说法是 - 我正在使用第三方控件,我们必须使用类似于以下代码才能通过JavaScript与我们的HTML页面进行通信
AXObjectName
其中AXObjectName_OnMouseClick
是控件的名称/ ID,index
是JavaScript函数的名称,它将在我的代码中触发,传递OnMouseClick
参数。但是,在控件中设置像index
这样的方法我需要做些什么呢?如果我不想传递任何实际信息(即,没有{{1}}),我甚至不得不走这么远吗?
答案 0 :(得分:10)
ActiveX事件是通过COM处理的,所以你需要在那里深入研究一下 。
COM需要记住的是,所有内容都是通过接口处理的,因此您通常需要创建两个接口,一个用于任何属性,一个用于您的事件。
事件的关键是使用ComSourceInterfaces属性标记您的类,该属性由MSDN描述为“标识作为属性类的COM事件源公开的接口列表。”
这个简单的类结构应该适合你(过去对我有用)。
namespace MyActiveX
{
[Guid("Your-GUID") ,InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IActiveXEvents
{
[DispId(1)]
void OnMouseClick(int index);
}
[Guid("Another-GUID"),InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IActiveX
{
//[DispId(1)]
// Any properties you want here like this
// string aProperty { get; set; }
}
[ComVisible(true)]
[Guid("Yet-Another-GUID"), ClassInterface(ClassInterfaceType.None)]
[ProgId("MyActiveX")]
[ComSourceInterfaces(typeof(IActiveXEvents))]
public partial class MyActiveX : UserControl, IActiveX
{
public delegate void OnMouseClickHandler(int index);
public event OnMouseClickHandler OnMouseClick;
// Dummy Method to use when firing the event
private void MyActiveX_nMouseClick(int index)
{
}
public MyActiveX()
{
InitializeComponent();
// Bind event
this.OnMouseClick = new OnMouseClickHandler(this.MyActiveX_MouseClick)
}
public void FireTheEvent()
{
int index = -1;
this.OnMouseClick(index);
}
}
}
如果您不需要任何属性,则可以排除IActiveX界面。此外,如果您要使用Click事件,则需要将其标记为 new 以将其传递给COM。