2009-06-23 3 views
0

У меня есть элемент управления ActiveX (OCX-файл), который вызывает событие. Я хочу поймать это событие на C#. Как мне это сделать?Управление событием управления ActiveX в 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

С вашего кода, похоже, CRMCntrl - это интерфейс с одним событием NewCall. Поэтому, если вы хотите, чтобы реализовал, этот интерфейс, то вы тот, кто несет ответственность за , стреляя в событие, а не обрабатывая его.

Чтобы обработать событие, снятое с вашего элемента управления ActiveX, вам необходимо использовать экземпляр вашего фактического элемента управления - вот откуда должно произойти событие. Если вы добавили элемент управления с помощью конструктора, попробуйте найти, что такое имя частного поля, которое содержит ссылку на ваш элемент управления.

Как-то вам нужно будет изменить:

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

к этому:

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

где myActiveXControl это имя элемента управления (который также реализует интерфейс, обеспечивающий событие).

+0

Спасибо, это сработало :) – akif

1

Что вы выложили должны работать, кроме ... что-то выглядит смешно о том, что вы делаете с определением самой формы. Вы получаете класс Form1 из формы и CRMCntrl? Это не создаст экземпляр элемента управления так, как вы ожидаете. Попробуйте вместо этого добавить новый экземпляр элемента управления ActiveX в форму и посмотреть, что произойдет.

+0

Эй, большое спасибо: P – akif

Смежные вопросы