on 07-12-2013 10:38 AM
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#?
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
}
}
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Thanks Hans It's work now with the abap stack tanks for your help!!!
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hi Hans,
I have to do the same for a specific user control, is it possible if you can provide sample example from c# code and abap code?
Thanks and regards
Jonathan
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Sorry Jonathan,
I cannot provide the whole code. This is not open source code and the project became giant with imaging and SAPGUI scripting.
But, if you not firm in C# and ActiveX, did you switch on the "Register for COM interop" in the C# project properties of the VisualStudio ( or a similar switch for other compilers) and do you register the resulting Dll with "c:\windows\Microsoft.NET\Framework\<.NET-version>\regasm.exe /tlb myactivx.dll"?
I found two other entries in the forum about this theme but no one was answered.
Is this the wrong forum? I thought this is a main point in SAP intoroperability - .NET!
Or is the knowledge in vacation and i am impatient?
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
82 | |
10 | |
10 | |
9 | |
6 | |
6 | |
5 | |
5 | |
4 | |
3 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.