2009-09-21 21 views
7

Ya estoy viendo algunas preguntas relacionadas con esto en SO, pero creo que el mío es lo suficientemente diferente como para no ser considerado un duplicado (si me equivoco, hágamelo saber).¿Cómo puedo hacer que un control ActiveX escrito con C# levante eventos en JavaScript al hacer clic?

Tengo un control ActiveX que he escrito en C# y aunque lo tengo principalmente funcionando, quiero plantear un evento en JavaScript cuando se hace clic (muestra una imagen por lo que es un elemento visual en la página).

El objetivo final de lo que estoy buscando lograr no es diferente de si fuera una etiqueta <span> y tenía un evento onclick para activar una función de JavaScript cuando se hacía clic en el área de la etiqueta.

La mayor parte del stuff I've read en él entra en detalles muy finos sobre cómo manejar eventos en un control ActiveX y enviar información de avance/retroceso, y eso está bien, pero parece demasiado complicado. No busco comunicarme con el control ActiveX, solo necesito una función de JavaScript para disparar cuando hago clic en ella, de manera similar a una etiqueta <span> o <div>. Puedo manejar todo lo demás en JavaScript. Simplemente envolviendo el control en un <span> o <div> con un evento onclick no tiene ningún efecto, el control ActiveX prácticamente lo anula.

¿Hay una manera simple de manejar esto para un control ActiveX escrito en C#?

supongo que otra manera de decirlo es - Estoy trabajando con un control de terceros y tenemos que utilizar un código similar al siguiente para conseguir que se comunique con nuestra página HTML a través de JavaScript

<script type="text/javascript" event="OnMouseClick(index)" for="AXObjectName"> 
     <!-- 
     AXObjectName_OnMouseClick(index); 
     //--> 
</script> 

Donde AXObjectName es el nombre/identificación del control y AXObjectName_OnMouseClick es el nombre de la función de JavaScript que se activará en mi código, pasando un parámetro index. Sin embargo, ¿qué tengo que hacer para configurar un método como OnMouseClick en el control? Y si no quiero pasar ninguna información real (es decir, no index), ¿tengo que llegar hasta aquí?

+0

Supongo que ya ha visto este ejemplo de código: http://www.c-sharpcorner.com/UploadFile/dsandor/ActiveXInNet11102005040748AM/ActiveXInNet.aspx – MusiGenesis

+0

De hecho, acabo de incluir el enlace para poder encontrarlo en mi otra computadora. Voy a probar un experimento de control ActiveX yo mismo y tal vez averiguar el evento. Parece relativamente sencillo. – MusiGenesis

+0

@MusiGenesis: sí, y es uno de los que seguí para llegar hasta aquí. Lo que no hace, sin embargo, es mostrar cómo la interacción con el control ActiveX puede tener algún efecto sobre el JavaScript en la página. –

Respuesta

8

Los eventos de ActiveX se manejan a través de COM, por lo que necesita profundizar allí un poco desafortunadamente.

Lo que hay que recordar con COM es que todo se maneja a través de interfaces, por lo que normalmente necesita crear dos interfaces, una para cada propiedad y otra para sus eventos.

La clave para los eventos es marcar su clase con el atributo ComSourceInterfaces, que MSDN describe como "Identifica una lista de interfaces expuestas como fuentes de eventos COM para la clase atribuida".

Esta estructura de clase simple debería funcionar para usted (tiene para mí en el pasado).

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); 
     }  
    } 
} 

Si no necesita ninguna propiedad, puede excluir la interfaz IActiveX. Además, si va a utilizar el evento Click, deberá marcarlo como new para pasarlo a COM.

+0

Haha :) Sin embargo, esta es una muy buena publicación de blog sobre esto, * buena * información sobre ActiveX y C# es bastante difícil de conseguir. Todavía he descubierto cómo hacer esto: http://stackoverflow.com/questions/746822/accessing-activex-ambient-properties-from-c – ParmesanCodice

+0

AAAAAAHHHH !!! ¡Mis ojos! ¿Por qué no puede ser esto fácil? – MusiGenesis

+0

@MusiGenesis He llegado a creer que es parte de un siniestro plan de Microsoft para matar a ActiveX. No nos ayuda a los muchachos que todavía necesitan producir esta tecnología. Las cosas son un * bit * más fáciles en VB .NET, vea http://www.codeproject.com/KB/COM/VS2005ComDllWalkThru.aspx – ParmesanCodice

Cuestiones relacionadas