Обработка события управления ActiveX в C # - PullRequest
0 голосов
/ 23 июня 2009

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

Вот мой код 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 ]

2 голосов
/ 23 июня 2009

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

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

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

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

к этому:

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

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

1 голос
/ 23 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...