' DMK28092004 Simple Composite Control for PAX selection ' A few things I've discovered... ' The MS directed convention of placing constructor code in CreateChildControls() and then ' calling EnsureChildControls() from everywhere that access a child control is a Flawed method. ' Build child controls in Init instead... ' DMK080205 Added ReadOnly Property for simple output Public Class satchPAX Inherits System.Web.UI.WebControls.WebControl Implements INamingContainer Dim ddlAdults As DropDownList Dim ddlChildren As DropDownList Dim ddlInfants As DropDownList Sub New() MyBase.New() Me.Width = Unit.Pixel(100) End Sub Protected Overrides Sub CreateChildControls() ' Moved to Initialize as is recommended due to broken functionality End Sub Protected Overrides Sub render(ByVal output As HtmlTextWriter) 'EnsureChildControls() RenderChildren(output) End Sub _ Property Adults() As Integer Get 'EnsureChildControls() Return ddlAdults.SelectedValue End Get Set(ByVal Value As Integer) 'EnsureChildControls() ddlAdults.SelectedValue = Value End Set End Property _ Property Children() As Integer Get 'EnsureChildControls() Return ddlChildren.SelectedValue End Get Set(ByVal Value As Integer) 'EnsureChildControls() ddlChildren.SelectedValue = Value End Set End Property _ Property Infants() As Integer Get 'EnsureChildControls() Return ddlInfants.SelectedValue End Get Set(ByVal Value As Integer) 'EnsureChildControls() ddlInfants.SelectedValue = Value End Set End Property Property [ReadOnly]() As Boolean Get Return CType(ViewState("readonly"), Boolean) End Get Set(ByVal Value As Boolean) ViewState("readonly") = Value End Set End Property Private Sub satchPAX_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Init ddlAdults = New DropDownList ddlChildren = New DropDownList ddlInfants = New DropDownList ' If they change costed pax details, reset the package search section ddlAdults.Attributes.Add("OnChange", "resetquote()") ddlChildren.Attributes.Add("OnChange", "resetquote()") ddlAdults.ID = "adults" ' so we can reference them in client-side js ddlChildren.ID = "children" Dim range(8) As ListItem Dim range2(8) As ListItem ' need to keep them separate For i As Integer = 0 To 8 range(i) = New ListItem(i.ToString) range2(i) = New ListItem(i.ToString) Next ddlAdults.Items.AddRange(range) ddlAdults.SelectedValue = "1" ' default to 1 adult ddlChildren.Items.AddRange(range2) ddlInfants.Items.AddRange(New ListItem() {New ListItem("0"), New ListItem("1"), New ListItem("2")}) Dim lit1 As New Literal Dim lit2 As New Literal Dim lit3 As New Literal Dim lit4 As New Literal lit1.Text = "
Adults" ' DMK29092004 hard-coded the font-weight to prevent style class from breaking 'the way its meant to look' lit2.Text = "
Children" lit3.Text = "
Infants" lit4.Text = "
" If [ReadOnly] Then Controls.Add(lit1) Controls.Add(New LiteralControl(ddlAdults.SelectedValue)) Controls.Add(lit2) Controls.Add(New LiteralControl(ddlChildren.SelectedValue)) Controls.Add(lit3) Controls.Add(New LiteralControl(ddlInfants.SelectedValue)) Controls.Add(lit4) Else Controls.Add(lit1) Controls.Add(ddlAdults) Controls.Add(lit2) Controls.Add(ddlChildren) Controls.Add(lit3) Controls.Add(ddlInfants) Controls.Add(lit4) End If End Sub ' tells the compiler not to expect a CLS compliant return type _ Public Function ToClassPax() As WorldLogic.resclasses.tQuote.tPax Dim tmp As New WorldLogic.resclasses.tQuote.tPax tmp.Adults = Adults tmp.Children = Children Return tmp End Function Public Overrides Function ToString() As String Dim tmp As String If Adults = 1 Then tmp = Adults.ToString & " adult, " Else tmp = Adults.ToString & " adults, " End If If Children = 1 Then tmp &= Children.ToString & " child, " ElseIf Children > 0 Then tmp &= Children.ToString & " children, " End If If Infants = 1 Then tmp &= Infants.ToString & " infant" ElseIf Infants > 0 Then tmp &= Infants.ToString & " infants" End If Return tmp End Function End Class