Click here to Skip to main content
15,886,067 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
See more:
I have an ActiveX user control what is displayed in the sapgui. This works fine.

Now I want to handle an event from the control to the ABAP code what was instantiating the control.

I know the handling with VB6 and the event id but how do it work with C# on ABAP side?
Thanks in advanced for answers
Posted

1 solution

I found the solution if I asked for "C# events in VB6". The main thing is the interface of type dispatch and how to bind it to the class with the code. Here is  the code how I solved this:

using System;
using System.Text;
using System.Runtime.InteropServices;




namespace SceSapGui
{
    public delegate void SceEventHandler(object text, EventArgs e);     // Definition of the event handler body (parameters)


    // Interface 1 (Dispatch)
    [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]     // This interface is for the event handler (dispatch)
    [GuidAttribute("00000000-0000-0000-0000-000000000001")]             // Anyone needs a different guid
    [ComVisible(true)]                                                  // Make it visible
    public interface ISceSapGuiDispatch
    {
        [DispId(1)]                                                     // Define the eventid
        void SceClicked(object text, EventArgs e);                      // Event definition
    }

    // Interface 2 (Methode and properties)
    [GuidAttribute("00000000-0000-0000-0000-000000000002")]             // Anyone needs a different guid
    [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsDual)]          // This interface is for data in/out
    [ComVisible(true)]                                                  // Make it visible
    public interface ISceSapGui
    {
        void Init(string @URI);                                         // definition of a methode
        string R3ReturnCode { get; }                                    // definition of a readonly property
    }

    [GuidAttribute("00000000-0000-0000-0000-000000000003")]             // Anyone needs a different guid
    [ClassInterface(ClassInterfaceType.None)]                           // Prevent compiler to build automaticaly a default interface
    [ComSourceInterfaces(typeof(ISceSapGuiDispatch))]                   // Attach the dispatch interface (don't know why in this way and not by inheritance like interface2)
    [ComVisible(true)]                                                  // Make it visible
    public partial class SceSapGui : ISceSapGui                         // Main class derived by interface 2
    {
        #region Interface member ISceSapGuiDispatch
        public event SceEventHandler SceClicked;                        // Event handler variable

        protected virtual void OnSceClicked(EventArgs e, string text)   // Call this if you want to raise the event
        {
            if (this.SceClicked != null)                                // but make it only if someone attached to it
                this.SceClicked((object)text, new EventArgs());         // Raise the event
        }
        #endregion

        #region Interface member ISceSapGui
        [ComVisible(true)]
        public void Init(string @URI)
        {
            // ...
        }

        [ComVisible(true)]
        public string R3ReturnCode
        {
            get { return "0"; }
        }

        #endregion
    }

}
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900