Nella compilazione di form è spesso utile obbligare l'utente a scegliere, come valore per un campo, un termine da un "dizionario", come accade con l'utilizzo del controllo DropDownList presente nel .NET Framework o nello corrispettivo tag <select> dell'HTML.
In situazioni particolari, però, può essere necessario permettere all'utente di editare una voce esistente o aggiungerne una nuova per l'esigenza specifica.
Questa funzionalità non è disponibile nel control DropDownList, pertanto può essere utile realizzare un custom control da potere riutilizzare nei progetti futuri.
Realizzazione del Custom Control
Per ottenere le funzionalità desiderate è possibile creare un composite custom web control (controllo composto) realizzato integrando un normale controllo HtmlInputText con un ListBox.
Senza dilungarmi sulle differenze tra i composite control e i normali custom control (individuabili su MSDN seguendo questo link ) vediamo le fasi salienti nella realizzazione:
Interfaccia INamingContainer
E' necessario implementare l'interfaccia INamingContainer affinché il controllo sia in grado di indirizzare gli eventi di postback ai controlli figli.
Questa interfaccia, inoltre, garantisce che i controlli che compongono il composite control abbiano nomi univoci, che ci mette al riparo da possibili conflitti negli ID nel caso in cui in una pagina siano utilizzate più istanze dello stesso controllo.
Implements INamingContainer
Proprietà del controllo
Questo controllo dovrà esporre, come per le DropDownList, le proprietà per impostare il testo e il valore associato alla lista, nonchè la sorgente da cui prelevare i dati con cui riempire il ListBox:
- Text
- Value
- DataSource
- DataValueField
- DataTextField
Ed ecco l'implementazione:
Inherits System.Web.UI.WebControls.WebControl Implements INamingContainer Dim txt As System.Web.UI.HtmlControls.HtmlInputText Dim val As System.Web.UI.HtmlControls.HtmlInputHidden Dim lnk As System.Web.UI.HtmlControls.HtmlAnchor Dim lst As System.Web.UI.WebControls.ListBox Private mtxtValue As String Private mvalValue As String Private mDictionary As DataView Private mDictionaryValueField As String Private mDictionaryTextField As String <Bindable(True), Category("Appearance"), DefaultValue(""), Description("The text value")> Property Text() As String Get Return txt.Value End Get Set(ByVal Value As String) mtxtValue = Value End Set End Property <Bindable(True), Category("Appearance"), DefaultValue(""), Description("The text value")> Property Value() As String Get Return val.Value End Get Set(ByVal Value As String) mvalValue = Value End Set End Property <Bindable(True), Category("Data"), DefaultValue(""), Description("The datasource used to populate the list with items")> Property DataSource() As DataView Get Return mDictionary End Get Set(ByVal Value As DataView) mDictionary = Value End Set End Property <Bindable(True), Category("Data"), DefaultValue("")> Property DataValueField() As String Get Return mDictionaryValueField End Get Set(ByVal Value As String) mDictionaryValueField = Value End Set End Property <Bindable(True), Category("Data"), DefaultValue("")> Property DataTextField() As String Get Return mDictionaryTextField End Get Set(ByVal Value As String) mDictionaryTextField = Value End Set End Property
Attenzione: Questo articolo contiene un allegato.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.