Skip to Content

Archived discussions are read-only. Learn more about SAP Q&A

How to handle C# events in ABAP

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#?

Tags:
Former Member
Former Member replied

OK, I found the solution by my self with hints from codeproject.com and stackoverflow.com. The main thing is the interface of type dispatch and the connection of it to the class.

Here is the code:

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

    }

}

0 View this answer in context
Not what you were looking for? View more on this topic or Ask a question