Collection editor example for those who have been searching.<BR><BR>Imports System<BR>Imports System.Web<BR>Imports System.Web.UI<BR>Imports System.Web.UI.WebControls<BR>Imports System.Web.UI.HtmlControls<BR>Imports System.ComponentModel<BR><BR><BR><BR>Namespace ComboBox<BR> < _<BR> ParseChildren(True, "Items") _<BR> > Public Class TextCombo<BR> Inherits TextBox<BR><BR> Dim _borderpadding As Integer<BR> Dim _HiLitebackcolor As System.Drawing.Color<BR> Dim _HiLiteforecolor As System.Drawing.Color<BR> Dim _items As New ArrayList()<BR> Dim _ShowDropDownButton As Boolean = True<BR><BR> <Category("Appearance")> _<BR> Public Property BorderPadding() As Integer<BR> Get<BR><BR> Return _borderpadding<BR> End Get<BR> Set(ByVal Value As Integer)<BR><BR> _borderpadding = Value<BR><BR> End Set<BR> End Property<BR><BR> <Category("Appearance")> _<BR> Public Property ShowDropDownButton() As Boolean<BR> Get<BR><BR> Return _ShowDropDownButton<BR> End Get<BR> Set(ByVal Value As Boolean)<BR><BR> _ShowDropDownButton = Value<BR><BR> End Set<BR> End Property<BR><BR> <Category("Appearance")> _<BR> Public Property HiliteBackColor() As System.Drawing.Color<BR> Get<BR> Return _HiLitebackcolor<BR> End Get<BR> Set(ByVal Value As System.Drawing.Color)<BR><BR> _HiLitebackcolor = Value<BR><BR> End Set<BR> End Property<BR><BR> <Category("Appearance")> _<BR> Public Property HiliteForeColor() As System.Drawing.Color<BR> Get<BR> Return _HiLiteforecolor<BR> End Get<BR> Set(ByVal Value As System.Drawing.Color)<BR> _HiLiteforecolor = Value<BR> End Set<BR> End Property<BR><BR><BR> <RefreshProperties(RefreshProperties.Repaint), _<BR> DesignerSerializationVisibility(DesignerSerializat ionVisibility.Content), _<BR> NotifyParentProperty(True), _<BR> Editor(GetType(TextComboCollectionEditor), GetType(System.Drawing.Design.UITypeEditor)), _<BR> PersistenceMode(PersistenceMode.InnerDefaultProper ty) _<BR> > _<BR> Public ReadOnly Property Items() As ArrayList<BR> Get<BR> Return _items<BR><BR> End Get<BR><BR> End Property<BR><BR> Public Function IsDesigning() As Boolean<BR> Try<BR> If Page.Site.DesignMode = True Then<BR> Return True<BR> Else<BR> Return False<BR> End If<BR> Catch<BR> Return False<BR> End Try<BR><BR> End Function<BR><BR> Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)<BR><BR> MyBase.Render(writer)<BR><BR> If _items.Count > 0 Then<BR> CreateDropDown()<BR> If Me._borderpadding > 0 Then<BR> Dim ctl As New Label()<BR> ctl.BackColor = System.Drawing.Color.Transparent<BR> ctl.ForeColor = System.Drawing.Color.Transparent<BR> ctl.BorderWidth = Unit.Pixel(0)<BR> ctl.Width = Unit.Pixel(_borderpadding)<BR> ctl.Height = Me.Height<BR> ctl.RenderControl(writer)<BR> End If<BR><BR> Dim _btn As New System.Web.UI.HtmlControls.HtmlButton()<BR> If BorderColor.IsEmpty And _<BR> BorderWidth.Equals(Unit.Empty) And _<BR> BorderStyle = BorderStyle.NotSet Then<BR> Else<BR> _btn.Style.Add("border-bottom", BorderColor.ToKnownColor.ToString & " " & BorderWidth.ToString & " " & BorderStyle.ToString)<BR> _btn.Style.Add("border-right", BorderColor.ToKnownColor.ToString & " " & BorderWidth.ToString & " " & BorderStyle.ToString)<BR> _btn.Style.Add("border-top", BorderColor.ToKnownColor.ToString & " " & BorderWidth.ToString & " " & BorderStyle.ToString)<BR> _btn.Style.Add("border-left", BorderColor.ToKnownColor.ToString & " " & BorderWidth.ToString & " " & BorderStyle.ToString)<BR> End If<BR> If BackColor.IsEmpty Then<BR> Else<BR> _btn.Style.Add("background-color", IIf(BackColor.ToKnownColor.ToString = "0", "White", BackColor.ToKnownColor.ToString))<BR> End If<BR> If Me.Height.IsEmpty Then<BR> _btn.Style.Add("height", "23px")<BR> Else<BR> _btn.Style.Add("height", Me.Height.ToString)<BR> End If<BR> _btn.Style.Add("font-size", "xx-small")<BR> If Me.Width.Equals(Unit.Percentage(90)) Then<BR> _btn.Style.Add("width", "8%")<BR> Else<BR> _btn.Style.Add("width", "20px")<BR> End If<BR> _btn.InnerText = "/"<BR><BR> Dim li As ListItem<BR> Dim str As String<BR> For Each li In Items<BR> str = str & li.Value & "?" & li.Text & "<BR>"<BR> Next<BR><BR> _btn.Attributes.Add("onClick", "showpop" & Me.ID & "(" & Me.UniqueID.Replace(":", "_") & "," & Chr(34) & str & Chr(34) & ");this.blur();")<BR> If Me._ShowDropDownButton Then<BR> Controls.Clear()<BR> Controls.Add(_btn)<BR> Renderchildren(writer)<BR> End If<BR> End If<BR><BR><BR><BR> End Sub<BR><BR> Protected Overrides Sub AddAttributesToRender(ByVal writer As HtmlTextWriter)<BR><BR> If _items.Count > 0 Then<BR><BR> Dim li As ListItem<BR> Dim str As String<BR> For Each li In Items<BR> str = str & li.Value & "?" & li.Text & "<BR>"<BR> Next<BR> writer.AddAttribute(HtmlTextWriterAttribute.Onclic k, "showpop" & Me.ID & "(" & Me.UniqueID.Replace(":", "_") & "," & Chr(34) & str & Chr(34) & ")")<BR> End If<BR><BR> MyBase.AddAttributesToRender(writer)<BR><BR> End Sub<BR><BR> Sub CreateDropDown()<BR><BR> Dim clht As Integer = 25<BR><BR> Dim str As String<BR> str = str & " <script> " & vbCrLf<BR> str = str & "" & vbCrLf<BR> str = str & "var oPopup" & Me.ID & " = window.createPopup()" & vbCrLf<BR><BR> str = str & "function showpop" & Me.ID & "(ctl,txt)" & vbCrLf<BR> str = str & "{" & vbCrLf<BR> str = str & " var oPopupBody = oPopup" & Me.ID & ".document.body;" & vbCrLf<BR> str = str & " var tvArray = txt.split('<BR>');" & vbCrLf<BR> str = str & " var cArr;" & vbCrLf<BR> str = str & " var tvArrayLen = tvArray.length;" & vbCrLf<BR><BR> str = str & "var str='"<BR><BR> str = str & "<Div style=' TABLE-LAYOUT: fixed; OVERFLOW: auto; WIDTH: 100%; HEIGHT: 100%'>"<BR> str = str & "<DIV style='TABLE-LAYOUT: fixed; OVERFLOW: auto; WIDTH: 100%; HEIGHT: 100%;"<BR><BR> str = str & " BORDER-TOP: " & IIf(BorderColor.IsEmpty, "gray", BorderColor.ToKnownColor.ToString) & " " & IIf(BorderWidth.IsEmpty, "1px", BorderWidth.ToString) & " " & IIf(BorderStyle = BorderStyle.NotSet, "solid", BorderStyle.ToString) & ";"<BR> str = str & " BORDER-BOTTOM: " & IIf(BorderColor.IsEmpty, "gray", BorderColor.ToKnownColor.ToString) & " " & IIf(BorderWidth.IsEmpty, "1px", BorderWidth.ToString) & " " & IIf(BorderStyle = BorderStyle.NotSet, "solid", BorderStyle.ToString) & ";"<BR> str = str & " BORDER-LEFT: " & IIf(BorderColor.IsEmpty, "gray", BorderColor.ToKnownColor.ToString) & " " & IIf(BorderWidth.IsEmpty, "1px", BorderWidth.ToString) & " " & IIf(BorderStyle = BorderStyle.NotSet, "solid", BorderStyle.ToString) & ";"<BR> str = str & " BORDER-RIGHT: " & IIf(BorderColor.IsEmpty, "gray", BorderColor.ToKnownColor.ToString) & " " & IIf(BorderWidth.IsEmpty, "1px", BorderWidth.ToString) & " " & IIf(BorderStyle = BorderStyle.NotSet, "solid", BorderStyle.ToString) & ";"<BR><BR> str = str & "'>"<BR> str = str & " <TABLE id=ctbl style='"<BR> str = str & " COLOR: " & IIf(Me.ForeColor.IsEmpty = True, "black", Me.ForeColor.ToKnownColor.ToString) & ";"<BR> str = str & " FONT-WEIGHT: " & IIf(Me.Font.Bold, "bold", "normal") & ";"<BR> str = str & " FONT-SIZE: " & IIf(Me.Font.Size.IsEmpty = True, "x-small", Me.Font.Size.ToString) & ";"<BR> str = str & " FONT-STYLE: " & IIf(Me.Font.Italic, "italic", "normal") & ";"<BR> str = str & " FONT-FAMILY: " & Me.Font.Name.ToString & ";"<BR> str = str & " TEXT-DECORATION: " & IIf(Me.Font.Underline, "underline ", " ") & IIf(Me.Font.Overline, "overline ", " ") & IIf(Me.Font.Strikeout, "line-through ", " ") & ""<BR> str = str & "'"<BR> If BackColor.IsEmpty Then<BR><BR> Else<BR> str = str & " bgcolor=" & BackColor.ToKnownColor.ToString<BR> End If<BR><BR> str = str & " cellSpacing=0 "<BR> str = str & " cellPadding=1 "<BR> str = str & " width=100% "<BR> str = str & " height=100%"<BR> str = str & ">'"<BR><BR><BR> str = str & " " & vbCrLf<BR> str = str & " for(var i=0;i<tvArrayLen-1;i++)" & vbCrLf<BR> str = str & " { " & vbCrLf<BR> str = str & " cArr = tvArray.split('?');" & vbCrLf<BR><BR> str = str & "str = str + '<TR><TD style=\" & Chr(34)<BR> str = str & " cursor='hand'"<BR><BR> str = str & "\" & Chr(34)<BR> str = str & " onMouseOver=this.style.backgroundColor='" & IIf(_HiLitebackcolor.ToKnownColor.ToString = "0", "silver", _HiLitebackcolor.ToKnownColor.ToString) & "';this.style.color='" & IIf(_HiLiteforecolor.ToKnownColor.ToString = "0", "black", _HiLiteforecolor.ToKnownColor.ToString) & "'"<BR> str = str & " onMouseOut=this.style.backgroundColor='transparent ';this.style.color='" & IIf(ForeColor.ToKnownColor.ToString = "0", "black", ForeColor.ToKnownColor.ToString) & "'"<BR> str = str & " onClick=parent.Form1.' + ctl.id + '.innerText='' + cArr[1] + '';parent.oPopup" & Me.ID & ".hide()"<BR> str = str & " height=" & clht & "px>' + cArr[1] + '"<BR> str = str & "</TD></TD></TR>'" & vbCrLf<BR> str = str & " }" & vbCrLf<BR> str = str & " str = str + '<tr><tr></table></Div>';" & vbCrLf<BR> str = str & " " & vbCrLf<BR> str = str & " oPopupBody.innerHTML = str;" & vbCrLf<BR> str = str & " oPopup" & Me.ID & ".show(0,ctl.offsetHeight + " & _borderpadding & ",ctl.offsetWidth + " & IIf(_ShowDropDownButton, Me._borderpadding + 20, 0) & "," & IIf(((clht) * _items.Count) > (clht * 10), clht * 10, ((clht + 1) * _items.Count) + 3) & ", ctl);" & vbCrLf<BR> str = str & " " & vbCrLf<BR> str = str & "" & vbCrLf<BR> str = str & " }" & vbCrLf<BR> str = str & " </script>" & vbCrLf<BR><BR> Page.RegisterStartupScript("ComboPopUp" & Me.ID, str)<BR><BR> End Sub<BR> End Class<BR><BR> Class TextComboCollectionEditor<BR> Inherits GenericCollectionEditor<BR><BR> Public Sub New()<BR> MyBase.New(GetType(ListItem))<BR><BR> End Sub<BR><BR> End Class<BR><BR><BR><BR><BR> Public Class GenericCollectionEditor<BR> Inherits System.ComponentModel.Design.CollectionEditor<BR><BR> Dim _types() As Type<BR><BR> Public Sub New(ByVal ParamArray ItemType() As System.Type)<BR> MyBase.New(GetType(Collection))<BR><BR> Dim i As Integer<BR> Dim itemCount As Integer = ItemType.Length<BR> ReDim _types(itemCount - 1)<BR><BR> For i = 0 To itemCount - 1<BR> _types(i) = ItemType(i)<BR> Next<BR><BR> End Sub<BR><BR> Protected Overrides Function CreateNewItemTypes() As System.Type()<BR> Return _types<BR> End Function<BR><BR> Protected Overrides Function CreateInstance(ByVal itemType As System.Type) As Object<BR><BR><BR> Dim obj As Object<BR> obj = System.Activator.CreateInstance(itemType)<BR><BR> Return obj<BR><BR> End Function<BR><BR> Protected Overrides Function CreateCollectionItemType() As System.Type<BR> Return _types(0)<BR> End Function<BR><BR><BR> Protected Overrides Function GetItems(ByVal editValue As Object) As Object()<BR> CreateNewItemTypes()<BR> Return MyBase.GetItems(editValue)<BR> End Function<BR><BR><BR><BR> End Class<BR><BR><BR><BR>End Namespace<BR><BR><BR><BR>