UI API Event Handling
August 20, 2023 #UI API, #Events, #Development 8 minute read

Working with UI API Events in SAP Business One

Understanding and properly handling UI API events is crucial for developing responsive and user-friendly SAP Business One add-ons. This guide covers comprehensive event handling techniques and best practices.

1. Setting Up Event Handlers

First, let's look at how to properly set up UI API event handlers:


public class UIEventManager
{
    private readonly SAPbouiCOM.Application _application;
    
    public UIEventManager(SAPbouiCOM.Application application)
    {
        _application = application;
        SetupEventHandlers();
    }

    private void SetupEventHandlers()
    {
        // Menu Events
        _application.MenuEvent += new SAPbouiCOM._IApplicationEvents_MenuEventEventHandler(HandleMenuEvent);
        
        // Item Events
        _application.ItemEvent += new SAPbouiCOM._IApplicationEvents_ItemEventEventHandler(HandleItemEvent);
        
        // Form Data Events
        _application.FormDataEvent += new SAPbouiCOM._IApplicationEvents_FormDataEventEventHandler(HandleFormDataEvent);
        
        // System Events
        _application.AppEvent += new SAPbouiCOM._IApplicationEvents_AppEventEventHandler(HandleAppEvent);
    }
}

2. Handling Form Events

Form events are crucial for managing user interactions:


public class FormEventHandler
{
    public void HandleItemEvent(string formUID, ref SAPbouiCOM.ItemEvent pVal, out bool bubbleEvent)
    {
        bubbleEvent = true;
        
        try
        {
            if (pVal.EventType == SAPbouiCOM.BoEventTypes.et_FORM_LOAD)
            {
                var form = _application.Forms.Item(formUID);
                InitializeForm(form);
            }
            
            if (pVal.EventType == SAPbouiCOM.BoEventTypes.et_ITEM_PRESSED)
            {
                if (pVal.ItemUID == "btnProcess")
                {
                    if (!pVal.BeforeAction)
                    {
                        ProcessButtonClick(formUID);
                    }
                }
            }

            if (pVal.EventType == SAPbouiCOM.BoEventTypes.et_CHOOSE_FROM_LIST)
            {
                HandleChooseFromList(formUID, pVal);
            }
        }
        catch (Exception ex)
        {
            _application.MessageBox($"Error in form event: {ex.Message}");
            bubbleEvent = false;
        }
    }
}

3. Matrix and Grid Events

Handle matrix and grid events effectively:


public class MatrixEventHandler
{
    public void HandleMatrixEvent(string formUID, string matrixUID, SAPbouiCOM.ItemEvent pVal)
    {
        var form = _application.Forms.Item(formUID);
        var matrix = (SAPbouiCOM.Matrix)form.Items.Item(matrixUID).Specific;

        switch (pVal.EventType)
        {
            case SAPbouiCOM.BoEventTypes.et_MATRIX_LINK_PRESSED:
                HandleMatrixLinkPress(matrix, pVal.Row, pVal.ColUID);
                break;

            case SAPbouiCOM.BoEventTypes.et_VALIDATE:
                ValidateMatrixEntry(matrix, pVal.Row, pVal.ColUID);
                break;

            case SAPbouiCOM.BoEventTypes.et_LOST_FOCUS:
                UpdateMatrixTotals(matrix);
                break;
        }
    }

    private void UpdateMatrixTotals(SAPbouiCOM.Matrix matrix)
    {
        double total = 0;
        for (int i = 1; i <= matrix.RowCount; i++)
        {
            total += Convert.ToDouble(matrix.GetCellSpecific("Amount", i).Value);
        }
        // Update totals...
    }
}

4. Menu Event Handling

Implement menu event handlers for custom functionality:


public class MenuEventHandler
{
    public void HandleMenuEvent(ref SAPbouiCOM.MenuEvent pVal, out bool bubbleEvent)
    {
        bubbleEvent = true;

        try
        {
            if (!pVal.BeforeAction)
            {
                switch (pVal.MenuUID)
                {
                    case "CustomMenu1":
                        HandleCustomMenu1();
                        break;

                    case "CustomMenu2":
                        HandleCustomMenu2();
                        break;

                    case "AddRow":
                        HandleAddRow(pVal.FormUID);
                        break;
                }
            }
        }
        catch (Exception ex)
        {
            _application.MessageBox($"Menu event error: {ex.Message}");
            bubbleEvent = false;
        }
    }
}

5. Best Practices and Performance Tips

Follow these best practices for optimal event handling:

  • Use BeforeAction and ActionSuccess appropriately
  • Implement proper error handling in all event handlers
  • Avoid blocking operations in event handlers
  • Cache form references when possible
  • Handle form closing events to clean up resources
  • Use SBO_Application.StatusBar for user feedback

Thanks,

Ahmed Aboalia