Saturday, September 8, 2007

Controlli Compositi in Asp.Net

. Saturday, September 8, 2007

Il .Net Framework ci permette di creare controlli compositi, quindi possiamo assemblare più controlli in un uno.
Metodo fondamentale è CreateChildControls ereditato dalla classe base Control la cui funzione è quella di generare il markup del controllo composito.
Inoltre è necessario implementare l'interfaccia INamingContainer(un'interfaccia indicatore) per garantire l'univocità dell'attributo ID dei controlli figli.
Supponiamo, quindi, di voler generare un controllo unico composto dai seguenti tre controlli: Label, TextboxCalendar ed inoltre vogliamo che sull'evento SelectionChanged del Calendar la property Text del controllo TextBox venga settata con il giorno selezionato.
La classe LabelTextboxCalendar:

Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls

Public Class LabelTextboxCalendar
Inherits Control
Implements INamingContainer

Protected _label As Label
Protected _textbox As TextBox
Protected _calendar As Calendar

Private _textLabel As String = String.Empty

Public Sub New()
MyBase.New()
End Sub

Public Property TextLabel() As String
Get
Return _textLabel
End Get
Set(ByVal Value As String)
_textLabel
= Value
End Set
End Property

Public ReadOnly Property DateSelected() As String
Get
Return _calendar.SelectedDate.ToString("dd/MM/yyyy")
End Get
End Property

Protected Overrides Sub CreateChildControls()
'Resetto la collection dei controls
Controls.Clear()
'Aggiungo il controllo label
_label = New Label
_label.Text
= TextLabel
Controls.Add(_label)
'Aggiungo uno spazio tra il controllo Label e il controllo TextBox
Controls.Add(New LiteralControl(" "))
'Aggiungo il controllo textbox
_textbox = New TextBox
_textbox.Enabled
= False
Controls.Add(_textbox)
'Aggiungo uno spazio
Controls.Add(New LiteralControl(" "))
'Aggiungo il controllo calendar
_calendar = New Calendar
_calendar.SelectedDate
= DateTime.Now
AddHandler _calendar.SelectionChanged, AddressOf SetDate
Controls.Add(_calendar)
End Sub

Private Sub SetDate(ByVal e As Object, ByVal sender As EventArgs)
_textbox.Text
= DateSelected
End Sub
End Class

A questo punto possiamo registrare il controllo nella toolbox di Visual Studio e trascianarlo sulla form web.

Come si può notare nel design di Visual Studio non viene renderizzato nulla che abbia l'aspetto di una label, più textbox, più calendar, per fare ciò creiamo la classe che si occuperà del rendering a design-time.

Imports System
Imports System.IO
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.Design

Public Class LblTxtCalDesign
Inherits System.Web.UI.Design.ControlDesigner

Public Overrides Function GetDesignTimeHtml() As String
Dim sw As StringWriter = New StringWriter
Dim htmlWriter As HtmlTextWriter = New HtmlTextWriter(sw)

Dim lb As Label = New Label
lb.Text
= "lblLabel"
lb.Width
= Unit.Pixel(70)
lb.Height
= Unit.Pixel(20)
Dim txt As TextBox = New TextBox
txt.Text
= String.Empty
txt.Width
= Unit.Pixel(100)
txt.Height
= Unit.Pixel(20)
Dim cal As Calendar = New Calendar
cal.Width
= Unit.Pixel(100)
cal.Height
= Unit.Pixel(100)
lb.RenderControl(htmlWriter)
txt.RenderControl(htmlWriter)
cal.RenderControl(htmlWriter)
Return sw.ToString()
End Function

End Class

Il metodo GetDesignTimeHtml torna una stringa HTML usata per la creazione del controllo composito a design-time.
A questo punto non ci resta che associare il controllo alla classe di DesignTime.

Imports System.ComponentModel

<Designer("ControlComposito.LblTxtCalDesign,ControlComposito")> _

Risultato finale:

0 commenti:

Post a Comment