以下は、継承されたComboBoxのコードです。問題は、ComboBoxがPopulateComboBox()
複数回入力されている()ことです。
編集:私はAmit Mittalのアドバイスを受け(以下で彼の答えを見つけてください)、実装しISupportInitialize
ました。NowPopulateComboBox()
は、実行時にのみ呼び出されます。
この実装では、アイテムは実行時に入力され、終了時に破棄される必要があります。ただし、デザイナ自体は、実行時に作成されたときにこれらの値を格納し、実行後に破棄することはありません。
このコードの実装に対する洗練されたソリューションはありますか?
Public Class ComboBoxExColors
Inherits ComboBox
Implements ISupportInitialize
Public Sub New()
MyBase.New()
Me.Size = New Size(146, 23)
Me.DropDownStyle = ComboBoxStyle.DropDownList
Me.MaxDropDownItems = 16
End Sub
Public Sub BeginInit() Implements System.ComponentModel.ISupportInitialize.BeginInit
' Do nothing?
End Sub
Public Sub EndInit() Implements System.ComponentModel.ISupportInitialize.EndInit
Me.DrawMode = DrawMode.OwnerDrawVariable ' fixed or variable?
Me.PopulateComboBox()
End Sub
Public Sub PopulateComboBox()
'Me.Items.Clear() ' rather than forcing items to be cleared, is there a more elegant solution to the implementation of this code, rather than forcing an item clear that shouldn't exist to begin with?
Me.Items.Add("Default")
Me.Items.Add("Custom")
Dim KnownColors() As String = System.Enum.GetNames(GetType(System.Drawing.KnownColor)) ' get all colors
For Each c As String In KnownColors ' add non system colors
If Not Color.FromName(c).IsSystemColor Then
Me.Items.Add(c)
End If
Next c
End Sub
Protected Overrides Sub OnDrawItem(ByVal e As DrawItemEventArgs)
' this draws each item onto the control
If e.Index > -1 Then
Dim item As String = Me.Items(e.Index).ToString
e.DrawBackground()
e.Graphics.DrawString(item, e.Font, SystemBrushes.WindowText, e.Bounds.X, e.Bounds.Y)
e.DrawFocusRectangle()
End If
End Sub
End Class