具有值的自定义组合框

Custom Combobox with values

我有一个 windows 应用程序,其中包含多个包含相同组合框的表单。
这些组合框有固定的项目。在每个表单上,我用这些值加载组合框。
例如:

Public Sub New()
   InitializeComponent()
   With Combobox1.Items
         .Insert(0, "Value1")
         .Insert(1, "Value2")
         .Insert(2, "Value3")
   End With
   With Combobox2.Items
         .Insert(0, "Value4")
         .Insert(1, "Value5")
         .Insert(2, "Value6")
   End With
End Sub

我不想在每个表单上重复这段代码,所以,有没有办法创建一个预先填充了这些值的自定义组合框,然后在每个表单上继承组合框?或者有其他合适的解决方案吗?

更新 1 根据 jmcilhinney 的评论,我创建了这个 class

 Public Class ComboClass
    Inherits System.Windows.Forms.ComboBox
    Public Sub New()

    End Sub

    Sub New(ByVal sender As String)
        If sender = "R" Then
            With Items
                    .Insert(0, "Value1")
                    .Insert(1, "Value2")
                    .Insert(2, "Value3")
            End With
        Else
                With Items
                    .Insert(0, "Value4")
                    .Insert(1, "Value5")
                    .Insert(2, "Value6")
                End With
        End If
    End Sub
End Class

然后我将新的自定义控件添加到我的表单中。
在 Private Sub InitializeComponent() 方法设计器代码中,我有以下内容:

Me.Combobox1 = New MyApplication.ComboClass("R")
Me.Combobox2 = New MyApplication.ComboClass("A")

我收到以下设计器错误:

The variable 'Combobox1' is either undeclared or was never assigned. 
The variable 'Combobox2' is either undeclared or was never assigned. 

我遗漏了一些东西,但我不知道它是什么。
感谢您的帮助。

您可以添加一个 Public 属性,而不是使用 class 构造函数(如果您想在设计器中创建控件,这不是很有用)一个 Enumerator(或者甚至是一个 String 值,正如您在这里所做的那样),它允许您在设计时定义 属性 值更改时预定义的数据集。

请注意,避免篡改 Designer.vb 代码。由Form Designer处理,这里一般不用写:只要修改Form设计就会被删除

自定义属性在此处称为CustomDataSet
此处的代码还下拉了 ComboBox 列表,因此您可以看到已设置的内容。

这是它的工作原理:

Imports System.ComponentModel

<DesignerCategory("Code")>
Public Class ComboClass
    Inherits ComboBox

    Private Selector As DataSelector = DataSelector.None

    Public Enum DataSelector
        None = 0
        Set1
        Set2
    End Enum

    Public Sub New()
        ' Initialization code, if needed
    End Sub

    <DefaultValue(DataSelector.None)>
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)>
    Public Property CustomDataSet As DataSelector
        Get
            Return Selector
        End Get
        Set(ByVal value As DataSelector)
            Selector = value
            Me.SetData()
        End Set
    End Property

    Private Sub SetData()
        Me.Items.Clear()
        Select Case Me.Selector
            Case DataSelector.None
            Case DataSelector.Set1
                Me.Items.AddRange({"Value1", "Value2", "Value3"})
            Case DataSelector.Set2
                Me.Items.AddRange({"Value6", "Value7", "Value8"})
            Case Else
                'NOP
        End Select
        If DesignMode Then Me.DroppedDown = True
    End Sub
End Class