Eventi del controllo

È possibile definire del comportamenti di interazione tra i controlli attraverso gli eventi.
Tutti gli eventi si basano sul valore del controllo sorgente per modificare le proprietà dei controlli target.
 
Sono disponibili tre tipi di evento:
  • SetDataSourceParameter: modifica i dati di uno o più controlli in base al valore del controllo sorgente
  • SetIsVisible: modifica la visibilità di uno o più controlli in base al valore del controllo sorgente
  • SetIsRequiredrichiede o meno il valore di uno o più controlli in base al valore del controllo sorgente
 
In generale per controlli target si intendono tutti quelli con Name o GroupName indicato nel campo TargetNames del metodo.
Infatti gli eventi permettono di creare dipendenze tra controlli e gruppi di controlli minimizzando la quantità di codice.
 
ControlBase mette a disposizione dei metodi per creare rapidamente eventi tipizzati. Questi metodi aggiungono l'evento alla lista Events del controllo. La lista verrà infine eseguita in fase di rendering del form. Questa ad esempio è l'implementazione di AddEventSetIsVisible:
 
public void AddEventSetIsVisible(EventCondition condition, List<string> referenceValues, List<string> targetNames, bool isKeepValueOnHidden = true)
        {
            this.Events.Add(new Event()
            {
                Type = EventType.SetIsVisible,
                Condition = condition,
                ReferenceValues = referenceValues,
                TargetNames = targetNames,
                IsKeepValueOnHidden = isKeepValueOnHidden
            });
        }
 
Evento SetDataSourceParameter
Con questo evento possiamo modificare i dati di un controllo target sulla base del valore attuale del controllo sorgente (e di altri controlli precedenti). Ad esempio possiamo mettere in relazione due DropDownList in modo che alla selezione di un valore nella prima (ad esempio AreaName) corrisponda il caricamento di dati a cascata nella seconda (ad esempio: CategoryName).
L'evento può essere aggiunto con il metodo AddEventSetDataSourceParameter che permette di specificare controlli sorgenti (ReferenceNames) e target (TargetNames). Possiamo quindi passare più valori sorgente al target per soluzioni più elaborate (as esempio tre DropDownList a cascata).
 
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using DataWeb.Data;
using DataWeb.Data.Controls;
using DataWeb.WebApp.Infrastructure;
using Microsoft.Extensions.Localization;

namespace MyApp.DataWeb.Data.Controls
{
    public class Product_AreaName :  DropDownList
    {
        private readonly AreaRepository areaRepository;
        private readonly IStringLocalizer localizer;

        public Product_AreaName(Form form, IServiceProvider serviceProvider) : base(form, serviceProvider)
        {
            areaRepository = serviceProvider.GetService<AreaRepository>();
            localizer = serviceProvider.GetService<IStringLocalizer>();
        }

        public override async Task InitAsync()
        {
            await base.InitAsync();

            AddEventSetDataSourceParameter(new List<string> { "AreaName" }, new List<string> { "CategoryName" });
        }
    }
}
 
La proprietà del controllo IsLateDataBinding può essere impostata sui controlli target per evitare che venga fatto un recupero dei dati in fase di rendering del form. Se IsLateDataBinding è true, il recupero dei dati avverrà soltanto all'esecuzione dell'evento.
 
 
Evento SetIsVisible
Con questo evento possiamo rendere visibili altri controlli in base al valore del controllo sorgente. Ad esempio possiamo visualizzare o nascondere determinati controlli in base a un flag di attivazione (ad esempio la validità opzionale di una news).
L'evento può essere aggiunto con il metodo AddEventSetIsVisible che permette di specificare il tipo di condizione (IsEmpty, IsNotEmpty,
IsEqual, IsNotEqual), i valori di riferimento (ReferenceValues) e i Name o i GroupName dei controlli target (TargetNames).
È possibile inoltre specificare l'opzione isKeepValueOnHidden che segnala ai controlli target di mantenere il valore quando sono nascosti.
 
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using DataWeb.Data;
using DataWeb.Data.Controls;

namespace MyApp.DataWeb.Data.Controls
{
    public class News_IsTermTime :  DropDownList
    {
        public News_IsTermTime(Form form, IServiceProvider serviceProvider) : base(form, serviceProvider)
        {
        }

        public override async Task InitAsync()
        {
            await base.InitAsync();

            AddEventSetIsVisible(EventCondition.IsEqual, new List<string> { "True" }, new List<string> { "TermTime" });
        }
    }
}
 
Evento SetIsRequired
Con questo evento possiamo rendere obbligatori altri controlli in base al valore del controllo sorgente. Ad esempio possiamo rendere obbligatoria una data se l'opzione di validità è impostata.
L'evento può essere aggiunto con il metodo AddEventSetIsRequired che permette di specificare il tipo di condizione (IsEmpty, IsNotEmpty,
IsEqual, IsNotEqual), i valori di riferimento (ReferenceValues) e i Name o i GroupName dei controlli target (TargetNames).
 
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using DataWeb.Data;
using DataWeb.Data.Controls;

namespace MyApp.DataWeb.Data.Controls
{
    public class News_IsTermTime :  DropDownList
    {
        public News_IsTermTime(Form form, IServiceProvider serviceProvider) : base(form, serviceProvider)
        {
        }

        public override async Task InitAsync()
        {
            await base.InitAsync();

            AddEventSetIsRequired(EventCondition.IsEqual, new List<string> { "True" }, new List<string> { "TermTimeDateStart" });
            AddEventSetIsRequired(EventCondition.IsEqual, new List<string> { "True" }, new List<string> { "TermTimeDateEnd" });
        }
    }
}