Wednesday, August 31, 2005

Custom drop down list

Drop down box that has autocomplete option

Imports System.ComponentModel
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Text

<DefaultProperty("DataSource"), ToolboxData("<{0}:DropDownList runat=server></{0}:DropDownList>")> _
Public Class DropDownList
Inherits System.Web.UI.WebControls.DropDownList

#Region "Private/Shared variables"
'required field validator properties
Private _isRequired As Boolean
Private _requiredErrorMessage As String = " Is Required"
Private _requiredText As String = " *"
Private _requiredDisplay As ValidatorDisplay = ValidatorDisplay.Static
Private _requiredVisible As Boolean = True
Private _requiredEnabled As Boolean = True
Private _requiredEnableClientScript As Boolean = True
Private _requiredEnableViewState As Boolean
Private _requiredCssClass As String = String.Empty
Private _requiredShowTextAlways As Boolean = True

' private controls
Private requiredValidate As RequiredFieldValidator

' private variables for key press function
Private Shared functionName As String = "DropDownList_onkeypress"
Private _caseSensitiveKey As Boolean = False
#End Region

#Region "Properties"

#Region "Property overrides"
<Bindable(True), Category("KeyPress"), DefaultValue(False)> _
Public Overridable Property CaseSensitiveKey() As Boolean
Get
If Me.EnableViewState Then
If Not ViewState("CaseSensitiveKey") Is Nothing Then
Return Convert.ToBoolean(ViewState("CaseSensitiveKey"))
Else
Return _caseSensitiveKey
End If
Else
Return _caseSensitiveKey
End If
End Get
Set(ByVal Value As Boolean)
_caseSensitiveKey = Value
If Me.EnableViewState Then
ViewState("CaseSensitiveKey") = Value
End If
End Set
End Property
#End Region

#Region "Custom properties"
<Bindable(True), Category("Validate"), DefaultValue(" Is Required")> _
Public Property RequiredErrorMessage() As String
Get
If Me.EnableViewState Then
If Not ViewState("RequiredErrorMessage") Is Nothing Then
Return Convert.ToString(ViewState("RequiredErrorMessage"))
Else
Return _requiredErrorMessage
End If
Else
Return _requiredErrorMessage
End If
End Get
Set(ByVal Value As String)
Try
_requiredErrorMessage = Value
If Me.EnableViewState Then
ViewState("RequiredErrorMessage") = Value
End If
If Not requiredValidate Is Nothing Then
requiredValidate.ErrorMessage = Value
End If
Catch
_requiredErrorMessage = String.Empty
If Me.EnableViewState Then
ViewState("RequiredErrorMessage") = String.Empty
End If
End Try
End Set
End Property

<Bindable(True), Category("Validate"), DefaultValue(False)> _
Public Property IsRequired() As Boolean
Get
If Me.EnableViewState Then
If Not ViewState("IsRequired") Is Nothing Then
Return Convert.ToBoolean(ViewState("IsRequired"))
Else
Return _isRequired
End If
Else
Return _isRequired
End If
End Get
Set(ByVal Value As Boolean)
Try
_isRequired = Value
If Me.EnableViewState Then
ViewState("IsRequired") = Value
End If
If Value Then
If requiredValidate Is Nothing Then
requiredValidate = New RequiredFieldValidator
requiredValidate.ControlToValidate = Me.UniqueID
requiredValidate.Display = _requiredDisplay
requiredValidate.ErrorMessage = RequiredErrorMessage
requiredValidate.Text = _requiredText
requiredValidate.EnableClientScript = _requiredEnableClientScript
requiredValidate.Enabled = _requiredEnabled
requiredValidate.Visible = _requiredVisible
requiredValidate.EnableViewState = _requiredEnableViewState
requiredValidate.CssClass = _requiredCssClass
Me.Controls.Add(requiredValidate)
End If
Else
If Not requiredValidate Is Nothing Then
Me.Controls.Remove(requiredValidate)
requiredValidate = Nothing
End If
End If
Catch
_isRequired = False
If Me.EnableViewState Then
ViewState("IsRequired") = False
End If
End Try
End Set
End Property

<Bindable(True), Category("Validate"), DefaultValue(" *")> _
Public Property RequiredText() As String
Get
If Me.EnableViewState Then
If Not ViewState("RequiredText") Is Nothing Then
Return Convert.ToString(ViewState("RequiredText"))
Else
Return _requiredText
End If
Else
Return _requiredText
End If
End Get
Set(ByVal Value As String)
Try
_requiredText = Value
If Me.EnableViewState Then
ViewState("RequiredText") = Value
End If
If Not requiredValidate Is Nothing Then
requiredValidate.Text = _requiredText
End If
Catch
_requiredText = String.Empty
If Me.EnableViewState Then
ViewState("RequiredText") = String.Empty
End If
End Try
End Set
End Property

<Bindable(True), Category("Validate"), DefaultValue(True)> _
Public Property RequiredShowTextAlways() As Boolean
Get
If Me.EnableViewState Then
If Not ViewState("RequiredShowTextAlways") Is Nothing Then
Return Convert.ToBoolean(ViewState("RequiredShowTextAlways"))
Else
Return _requiredShowTextAlways
End If
Else
Return _requiredShowTextAlways
End If
End Get
Set(ByVal Value As Boolean)
Try
_requiredShowTextAlways = Value
If Me.EnableViewState Then
ViewState("RequiredShowTextAlways") = Value
End If
Catch
_requiredShowTextAlways = True
If Me.EnableViewState Then
ViewState("RequiredShowTextAlways") = True
End If
End Try
End Set
End Property

<Bindable(True), Category("Validate"), DefaultValue(ValidatorDisplay.Static)> _
Public Property RequiredDisplay() As ValidatorDisplay
Get
If Me.EnableViewState Then
If Not ViewState("RequiredDisplay") Is Nothing Then
Return CType(ViewState("RequiredDisplay"), ValidatorDisplay)
Else
Return _requiredDisplay
End If
Else
Return _requiredDisplay
End If
End Get
Set(ByVal Value As ValidatorDisplay)
Try
_requiredDisplay = Value
If Me.EnableViewState Then
ViewState("RequiredDisplay") = Value
End If
If Not requiredValidate Is Nothing Then
requiredValidate.Display = Value
End If
Catch
_requiredDisplay = ValidatorDisplay.None
If Me.EnableViewState Then
ViewState("RequiredDisplay") = ValidatorDisplay.None
End If
End Try
End Set
End Property

<Bindable(True), Category("Validate"), DefaultValue(True)> _
Public Property RequiredVisible() As Boolean
Get
If Me.EnableViewState Then
If Not ViewState("RequiredVisible") Is Nothing Then
Return Convert.ToBoolean(ViewState("RequiredVisible"))
Else
Return _requiredVisible
End If
Else
Return _requiredVisible
End If
End Get
Set(ByVal Value As Boolean)
Try
_requiredVisible = Value
If Me.EnableViewState Then
ViewState("RequiredVisible") = Value
End If
If Not requiredValidate Is Nothing Then
requiredValidate.Visible = _requiredVisible
End If
Catch
_requiredVisible = False
If Me.EnableViewState Then
ViewState("RequiredVisible") = False
End If
End Try
End Set
End Property

<Bindable(True), Category("Validate"), DefaultValue(True)> _
Public Property RequiredEnabled() As Boolean
Get
If Me.EnableViewState Then
If Not ViewState("RequiredEnabled") Is Nothing Then
Return Convert.ToBoolean(ViewState("RequiredEnabled"))
Else
Return _requiredEnabled
End If
Else
Return _requiredEnabled
End If
End Get
Set(ByVal Value As Boolean)
Try
_requiredEnabled = Value
If Me.EnableViewState Then
ViewState("RequiredEnabled") = Value
End If
If Not requiredValidate Is Nothing Then
requiredValidate.Enabled = _requiredEnabled
End If
Catch
_requiredEnabled = False
If Me.EnableViewState Then
ViewState("RequiredEnabled") = False
End If
End Try
End Set
End Property

<Bindable(True), Category("Validate"), DefaultValue(True)> _
Public Property RequiredEnableClientScript() As Boolean
Get
If Me.EnableViewState Then
If Not ViewState("RequiredEnableClientScript") Is Nothing Then
Return Convert.ToBoolean(ViewState("RequiredEnableClientScript"))
Else
Return _requiredEnableClientScript
End If
Else
Return _requiredEnableClientScript
End If
End Get
Set(ByVal Value As Boolean)
Try
_requiredEnableClientScript = Value
If Me.EnableViewState Then
ViewState("RequiredEnableClientScript") = Value
End If
If Not requiredValidate Is Nothing Then
requiredValidate.EnableClientScript = _requiredEnableClientScript
End If
Catch
_requiredEnableClientScript = False
If Me.EnableViewState Then
ViewState("RequiredEnableClientScript") = False
End If
End Try
End Set
End Property

<Bindable(True), Category("Validate"), DefaultValue(False)> _
Public Property RequiredEnableViewState() As Boolean
Get
If Me.EnableViewState Then
If Not ViewState("RequiredEnableViewState") Is Nothing Then
Return Convert.ToBoolean(ViewState("RequiredEnableViewState"))
Else
Return _requiredEnableViewState
End If
Else
Return _requiredEnableViewState
End If
End Get
Set(ByVal Value As Boolean)
Try
_requiredEnableViewState = Value
If Me.EnableViewState Then
ViewState("RequiredEnableViewState") = Value
End If
If Not requiredValidate Is Nothing Then
requiredValidate.EnableViewState = _requiredEnableViewState
End If
Catch
_requiredEnableViewState = False
If Me.EnableViewState Then
ViewState("RequiredEnableViewState") = False
End If
End Try
End Set
End Property

<Bindable(True), Category("Validate"), DefaultValue("")> _
Public Property RequiredCSSClass() As String
Get
If Me.EnableViewState Then
If Not ViewState("RequiredCssClass") Is Nothing Then
Return Convert.ToString(ViewState("RequiredCssClass"))
Else
Return _requiredCssClass
End If
Else
Return _requiredCssClass
End If
End Get
Set(ByVal Value As String)
Try
_requiredCssClass = Value
If Me.EnableViewState Then
ViewState("RequiredCssClass") = Value
End If
If Not requiredValidate Is Nothing Then
requiredValidate.CssClass = _requiredCssClass
End If
Catch
_requiredCssClass = String.Empty
If Me.EnableViewState Then
ViewState("RequiredCssClass") = String.Empty
End If
End Try
End Set
End Property
#End Region

#End Region

#Region "Overrides"
Protected Overrides Sub Render(ByVal output As System.Web.UI.HtmlTextWriter)
If Not Me.Enabled Then
Me.BorderWidth = WebControls.Unit.Pixel(0)
End If
MyBase.Render(output)
If Not requiredValidate Is Nothing Then
If Me._requiredShowTextAlways Then
If Me._requiredCssClass.Length > 0 Then
output.Write(HtmlTextWriter.SpaceChar)
output.Write("<span class=""" &&nbsp;Me._requiredCssClass &&nbsp;""">" &&nbsp;Me._requiredText &&nbsp;"</span>")
Else
output.Write(HtmlTextWriter.SpaceChar)
output.Write("<span style=""color:Red"">" &&nbsp;Me._requiredText &&nbsp;"</span>")
End If
requiredValidate.Text = String.Empty
requiredValidate.Display = ValidatorDisplay.None
End If
requiredValidate.RenderControl(output)
End If
End Sub

Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
MyBase.OnLoad(e) ' call the base class method
' define the client-side script
Dim script As StringBuilder = New StringBuilder(500)
script.Append("<script language=" &&nbsp;Chr(34) &&nbsp;"javascript" &&nbsp;Chr(34) &&nbsp;" " &&nbsp;vbCrLf)
script.Append("type=" &&nbsp;Chr(34) &&nbsp;"text/javascript" &&nbsp;Chr(34) &&nbsp;">" &&nbsp;vbCrLf)
script.Append("function " &&nbsp;functionName &&nbsp;" (dropdownlist,caseSensitive) {" &&nbsp;vbCrLf)
script.Append(" // check the keypressBuffer attribute is defined on the dropdownlist" &&nbsp;vbCrLf)
script.Append(" var undefined; " &&nbsp;vbCrLf)
script.Append(" if (dropdownlist.keypressBuffer == undefined) { " &&nbsp;vbCrLf)
script.Append(" dropdownlist.keypressBuffer = ''; " &&nbsp;vbCrLf)
script.Append(" } " &&nbsp;vbCrLf)
script.Append(" // get the key that was pressed " &&nbsp;vbCrLf)
script.Append(" var key = String.fromCharCode(window.event.keyCode); " &&nbsp;vbCrLf)
script.Append(" dropdownlist.keypressBuffer += key;" &&nbsp;vbCrLf)
script.Append(" if (!caseSensitive) {" &&nbsp;vbCrLf)
script.Append(" // convert buffer to lowercase" &&nbsp;vbCrLf)
script.Append(" dropdownlist.keypressBuffer = dropdownlist.keypressBuffer.toLowerCase();" &&nbsp;vbCrLf)
script.Append(" }" &&nbsp;vbCrLf)
script.Append(" // find if it is the start of any of the options " &&nbsp;vbCrLf)
script.Append(" var optionsLength = dropdownlist.options.length; " &&nbsp;vbCrLf)
script.Append(" for (var n=0; n < optionsLength; n++) { " &&nbsp;vbCrLf)
script.Append(" var optionText = dropdownlist.options[n].text; " &&nbsp;vbCrLf)
script.Append(" if (!caseSensitive) {" &&nbsp;vbCrLf)
script.Append(" optionText = optionText.toLowerCase();" &&nbsp;vbCrLf)
script.Append(" }" &&nbsp;vbCrLf)
script.Append(" if (optionText.indexOf(dropdownlist.keypressBuffer,0) == 0) { " &&nbsp;vbCrLf)
script.Append(" dropdownlist.selectedIndex = n; " &&nbsp;vbCrLf)
script.Append(" return false; // cancel the default behavior since " &&nbsp;vbCrLf)
script.Append(" // we have selected our own value " &&nbsp;vbCrLf)
script.Append(" } " &&nbsp;vbCrLf)
script.Append(" } " &&nbsp;vbCrLf)
script.Append(" // reset initial key to be inline with default behavior " &&nbsp;vbCrLf)
script.Append(" dropdownlist.keypressBuffer = key; " &&nbsp;vbCrLf)
script.Append(" return true; // give default behavior " &&nbsp;vbCrLf)
script.Append("} " &&nbsp;vbCrLf)
script.Append("</script>")

' register the client-side script block
Me.Page.RegisterClientScriptBlock(functionName, script.ToString())
' add to the onkeypress event
Me.Attributes.Add("onkeypress", "return " + functionName + "(this," + _caseSensitiveKey.ToString().ToLower() + ")")
End Sub

Protected Overrides Function CreateControlCollection() As System.Web.UI.ControlCollection
Return New ControlCollection(Me)
End Function

Protected Overrides Sub LoadViewState(ByVal savedState As Object)
If Not savedState Is Nothing Then
MyBase.LoadViewState(savedState)
Me.IsRequired = Me.IsRequired
End If
End Sub

#End Region

End Class

No comments: