2009-09-21 25 views
7

Tôi thấy một số câu hỏi liên quan đến điều này trên SO, nhưng tôi nghĩ rằng tôi là đủ khác nhau để không được coi là một bản sao (nếu tôi sai cho tôi biết).Làm cách nào để tạo điều khiển ActiveX được viết bằng C# tăng sự kiện trong JavaScript khi được nhấp?

Tôi có điều khiển ActiveX tôi đã viết trong C# và trong khi tôi làm việc chủ yếu, tôi muốn nâng cao sự kiện trong JavaScript khi được nhấp (nó hiển thị hình ảnh để phần tử trực quan trên trang).

Mục tiêu cuối cùng của những gì tôi đang tìm cách hoàn thành không khác biệt nếu đó là thẻ <span> và nó có sự kiện onclick để tăng chức năng JavaScript khi khu vực của thẻ được nhấp.

Hầu hết các số stuff I've read trên đó đi vào chi tiết rất tốt về cách xử lý sự kiện trong điều khiển ActiveX và gửi thông tin qua lại, và điều đó tốt, nhưng có vẻ quá phức tạp. Tôi không muốn giao tiếp với điều khiển ActiveX, tôi chỉ cần một hàm JavaScript để kích hoạt khi tôi nhấp vào nó, theo cách tương tự như một thẻ <span> hoặc <div>. Tôi có thể xử lý mọi thứ khác trong JavaScript. Chỉ cần gói điều khiển trong một số <span> hoặc <div> với sự kiện onclick không có hiệu lực - điều khiển ActiveX sẽ ghi đè lên rất nhiều.

Có cách nào đơn giản để xử lý việc này cho điều khiển ActiveX được viết bằng C# không?

Tôi đoán một cách khác để đưa nó được - Tôi đang làm việc với một điều khiển bên thứ ba và chúng ta phải sử dụng mã tương tự như sau để có được nó để giao tiếp với trang HTML của chúng tôi qua JavaScript

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

Trong đó AXObjectName là tên/id của điều khiển và AXObjectName_OnMouseClick là tên của hàm JavaScript nó sẽ kích hoạt trong mã của tôi, chuyển thông số index. Tuy nhiên, tất cả những gì tôi phải làm để thiết lập một phương pháp như OnMouseClick trong điều khiển? Và nếu tôi không muốn chuyển bất kỳ thông tin thực tế nào (tức là, không có index) thì tôi có phải đi xa đến mức này không?

+0

Tôi đoán bạn đã thấy mẫu mã này: http://www.c-sharpcorner.com/UploadFile/dsandor/ActiveXInNet11102005040748AM/ActiveXInNet.aspx – MusiGenesis

+0

Tôi thực sự chỉ bao gồm liên kết để tôi có thể tìm thấy nó máy tính khác của tôi. Tôi sẽ thử một thử nghiệm điều khiển ActiveX bản thân mình và có thể tìm ra sự kiện. Nó trông tương đối đơn giản. – MusiGenesis

+0

@MusiGenesis: yeah, và đó là một trong những thứ tôi theo sau để đạt được điều này. Những gì nó không làm, mặc dù, là hiển thị như thế nào tương tác với điều khiển ActiveX có thể có bất kỳ tác dụng trên JavaScript trong trang. –

Trả lời

8

Sự kiện ActiveX được xử lý qua COM, vì vậy bạn cần phải nghiên cứu kỹ ở đây một chút tiếc là.

Điều cần nhớ với COM là mọi thứ được xử lý thông qua giao diện, vì vậy bạn thường cần tạo hai giao diện, một giao diện cho bất kỳ thuộc tính nào và một cho sự kiện của bạn.

Chìa khóa cho sự kiện là đánh dấu lớp của bạn với thuộc tính ComSourceInterfaces, được mô tả bởi MSDN là "Xác định danh sách các giao diện được hiển thị dưới dạng nguồn sự kiện COM cho lớp được phân bổ".

Cấu trúc lớp đơn giản này sẽ phù hợp với bạn (nó có đối với tôi trong quá khứ).

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

Nếu bạn không cần bất kỳ thuộc tính nào, bạn có thể loại trừ giao diện IActiveX. Ngoài ra, nếu bạn định sử dụng sự kiện Nhấp, bạn sẽ cần đánh dấu sự kiện đó là mới để chuyển nó đến COM.

+0

Haha :) Đó là một bài đăng blog thực sự tốt về điều này mặc dù, * tốt * thông tin trên ActiveX và C# là khá khó để đi qua. Tôi vẫn tìm ra cách thực hiện điều này: http://stackoverflow.com/questions/746822/accessing-activex-ambient-properties-from-c – ParmesanCodice

+0

AAAAAAHHHH !!! Đôi mắt của tôi! Tại sao điều này không dễ dàng? – MusiGenesis

+0

@MusiGenesis Tôi đã tin rằng đó là một phần của kế hoạch nham hiểm của Microsoft để tiêu diệt ActiveX. Không giúp chúng tôi những người vẫn cần phải sản xuất công nghệ này. Mọi thứ đều dễ dàng hơn trong VB .NET * xem http://www.codeproject.com/KB/COM/VS2005ComDllWalkThru.aspx – ParmesanCodice

Các vấn đề liên quan