Как сделать элемент управления ActiveX, написанный на C #, вызывать события в JavaScript при нажатии? - PullRequest
7 голосов
/ 21 сентября 2009

Я уже вижу несколько вопросов, связанных с этим, на SO, но я думаю, что мой достаточно отличается, чтобы не считаться дубликатом (если я ошибаюсь, дайте мне знать).

У меня есть элемент управления ActiveX, который я написал на C #, и хотя он в основном работает, я хочу вызывать событие в JavaScript при его нажатии (оно отображает изображение, поэтому оно является визуальным элементом на странице).

Конечная цель того, чего я хочу достичь, ничем не отличается от того, если бы это был тег <span>, и у него было событие onclick для вызова функции JavaScript при нажатии на область тега.

Большая часть материала , который я прочитал , содержит очень мелкие детали о том, как обрабатывать события в элементе управления ActiveX и отправлять информацию назад / вперед, и это хорошо, но кажется слишком сложным. Я не собираюсь связываться с элементом управления ActiveX, мне просто нужна функция JavaScript, которая запускается при нажатии на нее, подобно тегу <span> или <div>. Я могу справиться со всем остальным в JavaScript. Простая упаковка элемента управления в <span> или <div> с событием onclick не имеет никакого эффекта - элемент управления ActiveX в значительной степени переопределяет его.

Есть ли простой способ справиться с этим для элемента управления ActiveX, написанного на C #?

Я думаю, что другой способ выразить это - я работаю со сторонним элементом управления, и мы должны использовать код, подобный следующему, чтобы заставить его взаимодействовать с нашей HTML-страницей через JavaScript

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

Где AXObjectName - это имя / идентификатор элемента управления, а AXObjectName_OnMouseClick - это имя функции JavaScript, которая будет запускаться в моем коде, передавая параметр index. Тем не менее, что мне нужно сделать, чтобы настроить такой метод, как OnMouseClick в элементе управления? И если я не хочу передавать какую-либо фактическую информацию (то есть, нет index), мне даже нужно идти так далеко?

1 Ответ

11 голосов
/ 22 сентября 2009

События ActiveX обрабатываются через COM, поэтому вам нужно немного углубиться в них к сожалению .

При работе с COM следует помнить, что все обрабатывается через интерфейсы, поэтому обычно требуется создать два интерфейса: один для любых свойств и один для ваших событий.

Ключом для событий является пометка вашего класса атрибутом ComSourceInterfaces, который описывается MSDN как «Идентифицирует список интерфейсов, представляемых как источники событий COM для приписанного класса».

Эта простая структура класса должна работать для вас (она имела для меня в прошлом).

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

Если вам не нужны какие-либо свойства, вы можете просто исключить интерфейс IActiveX. Также, если вы собираетесь использовать событие Click, вам нужно будет пометить его как new , чтобы передать его в COM.

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