2009-09-21 9 views
7

Widzę kilka pytań związanych z tym na SO, ale myślę, że moje są wystarczająco różne, aby nie uznać za duplikat (jeśli się mylę, daj mi znać).Jak mogę utworzyć formant ActiveX zapisany przy kliknięciach zdarzeń C# w kodzie JavaScript?

Mam formantu ActiveX napisałem w języku C# i podczas gdy mam go głównie pracy, chcę podnieść zdarzenia w JavaScript, gdy jest kliknięty (wyświetla obraz, więc jest to element wizualny na stronie).

Ostatecznym celem tego, co chcę osiągnąć, nie różni się od tagu <span> i miało wydarzenie onclick do podniesienia funkcji JavaScript po kliknięciu obszaru znacznika.

Większość z stuff I've read zawiera bardzo szczegółowe informacje na temat obsługi zdarzeń w formancie ActiveX i wysyłania informacji w przód/w tył, co jest w porządku, ale wydaje się zbyt skomplikowane. Nie chcę komunikować się z formantem ActiveX, potrzebuję tylko funkcji JavaScript, aby odpalić po kliknięciu, w sposób podobny do tagu <span> lub <div>. Potrafię obsłużyć wszystko inne w JavaScript. Po prostu zawijanie formantu w <span> lub <div> przy zdarzeniu onclick nie ma żadnego efektu - kontrolka ActiveX prawie go nadpisuje.

Czy istnieje prosty sposób na obsłużenie tego dla formantu ActiveX napisanego w języku C#?

Chyba inny sposób oddania go - Pracuję z kontrolą osób trzecich i musimy użyć kodu podobnego do następującego, aby zmusić go do komunikowania się z naszej strony HTML poprzez JavaScript

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

Gdzie AXObjectName to nazwa/identyfikator kontrolki, a AXObjectName_OnMouseClick to nazwa funkcji JavaScript, która uruchomi mój kod, przekazując parametr index. Co jednak muszę zrobić, aby skonfigurować w sterowaniu metodę taką jak OnMouseClick? A jeśli nie chcę przekazywać żadnych faktycznych informacji (tj. Nr index), czy muszę iść tak daleko?

+0

Zgaduję, że już widziałeś ten przykładowy kod: http://www.c-sharpcorner.com/UploadFile/dsandor/ActiveXInNet11102005040748AM/ActiveXInNet.aspx – MusiGenesis

+0

Właśnie umieściłem link, dzięki czemu mogę go znaleźć na mój drugi komputer. Mam zamiar samemu wypróbować eksperyment kontrolny ActiveX i może wymyślę to wydarzenie. Wygląda stosunkowo prosto. – MusiGenesis

+0

@MusiGenesis: tak, i to jedna z tych, które śledziłem, aby zająć tak daleko. To, czego nie robi, to pokazanie, jak interakcja z formantem ActiveX może mieć jakikolwiek wpływ na JavaScript na stronie. –

Odpowiedz

8

Zdarzenia ActiveX są obsługiwane przez COM, więc trzeba tam trochę zagłębić .

Rzeczą do zapamiętania w COM jest to, że wszystko jest obsługiwane za pomocą interfejsów, więc zwykle musisz utworzyć dwa interfejsy, jeden dla dowolnych właściwości i jeden dla twoich zdarzeń.

Kluczem do zdarzeń jest oznaczenie klasy za pomocą atrybutu ComSourceInterfaces, który jest opisany przez MSDN jako "Określa listę interfejsów, które są odsłonięte jako źródła zdarzeń COM dla przypisanej klasy."

Ta prosta struktura klasowa powinna zadziałać dla ciebie (ma to dla mnie w przeszłości).

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

Jeśli nie potrzebujesz żadnych właściwości, możesz po prostu wykluczyć interfejs IActiveX. Również jeśli zamierzasz używać zdarzenia Click, musisz oznaczyć je jako nowy, aby przekazać je do COM.

+0

Haha :) To jest naprawdę dobry blog na ten temat, * dobre informacje na ActiveX i C# są dość trudne do zdobycia. Wciąż się dowiedziałem, jak to zrobić: http://stackoverflow.com/questions/746822/accessing-activex-ambient-properties-from-c – ParmesanCodice

+0

AAAAAAHHHH !!! Moje oczy! Dlaczego to nie może być łatwe? – MusiGenesis

+0

@MusiGenesis Doszedłem do wniosku, że jest to część złowieszczego planu Microsoftu dotyczącego zabicia ActiveX. Nie pomaga nam facetów, którzy wciąż muszą produkować tę technologię. W VB .NET jest łatwiej * * łatwiejsze zobacz http://www.codeproject.com/KB/COM/VS2005ComDllWalkThru.aspx – ParmesanCodice