'Custom Combobox with values

I have a windows application with multiple Forms containing the same ComboBoxes.
These Comboboxes have fixed items. On each Form I load the Comboboxes with these values.
For example:

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

I don't want to repeat this code on every Form so, is there a way to create a custom Combobox that is pre-filled with these values, and then inherit the Comboboxes on each Form? Or is there another proper solution?

UPDATE 1 Based on jmcilhinney's comment, I have created this 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

And then I added the new custom control to my Form.
In the Private Sub InitializeComponent() method designer code, I have the following:

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

I get the following designer error:

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

I'm missing something but I don't know what it is.
Thanks for your help.



Solution 1:[1]

Instead of using the class Constructor (which isn't much useful if you want to create your controls in the Designer), you could add a Public Property that accepts an Enumerator (or even a String value, as you're doing here) that lets you define, at Design Time, pre-defined data sets when the property value is changed.

As a note, avoid tampering with the Designer.vb code. It's handled by the Form Designer, you don't usually write anything here: it will be delete as soon as the Form design is modified.

The custom Property is called CustomDataSet, here.
The code here also drops down the ComboBox List, so you can see what has been set.

This is how it works:

Custom ComboBox Selector

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

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1