Ciao a tutti,
vorrei condividere con voi una semplice modalità che ho utilizzato per permettere all’utente di scegliere il valore di un campo da una lista ma, se necessario, anche di inserire un valore non presente tra quelli proposti.
In questo esempio ho un oggetto Voce che contiene la proprietà ClassificazioneCausale e un pannello Voce che consente di modificare questo oggetto.
L’idea è costruire dinamicamente la lista dei valori esistenti e aggiungere una voce speciale che permetta all’utente di inserire una nuova classificazione. La soluzione richiede poche righe di codice in due punti.
Inizializzazione del campo (SendMessage)
Nel metodo SendMessage inizializzo la value list del campo:
Voce.ClassificazioneCausale.clearValueList()
boolean b = false
for each row (readonly)
{
select distinct
valore = ClassificazioneCausale
from
Voci // master table
where
!(isNull(ClassificazioneCausale))
Lista = CausaliAttività
Voce.ClassificazioneCausale.addValueListItem(valore, valore, ...)
b = true
}
if (b)
{
Voce.ClassificazioneCausale.addValueListItem("#new#", "(Nuova classificazione)", ...)
}
Il piccolo “trucco” qui è aggiungere una voce fittizia: (Nuova classificazione).
Questa voce non rappresenta un valore reale, ma serve solo per intercettare il caso in cui l’utente voglia inserire una nuova classificazione.
Gestione della scelta (OnUpdatingRow)
Nel pannello, nell’evento OnUpdatingRow, intercetto la selezione della voce speciale:
if (Column = Voce.ClassificazioneCausale.me())
{
if (FieldModified = true)
{
if (Voce.ClassificazioneCausale = "#new#")
{
Voce.ClassificazioneCausale = null
Voce.ClassificazioneCausale.clearValueList()
Voce.ClassificazioneCausale.setFocus(true)
}
}
}
Se l’utente seleziona “Nuova classificazione”, il campo viene svuotato, liberato dalla value list e rimesso in focus. A quel punto l’utente può digitare liberamente il nuovo valore.
Non è una soluzione perfetta, ma nella sua semplicità funziona bene e permette all’utente di usare classificazioni già esistenti oppure crearne di nuove al volo, senza introdurre troppa complessità nel pannello.
Sono curioso di sapere cosa ne pensate e, soprattutto, se qualcuno ha affrontato lo stesso problema in modo diverso o con una soluzione migliore ![]()