具有值的自定义组合框

时间:2019-02-09 23:31:46

标签: vb.net winforms combobox

我有一个Windows应用程序,其中包含包含相同ComboBox的多个窗体。
这些组合框具有固定项。在每个表格上,我使用这些值加载组合框。
例如:

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的评论,我创建了此类

 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. 

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

1 个答案:

答案 0 :(得分:2)

您可以添加一个接受Enumerator(甚至是String值)的Public属性来代替使用类Constructor(如果要在Designer中创建控件的用处不大)。这里),您可以在设计时定义更改属性值时的预定义数据集。

请注意,避免篡改Designer.vb代码。它由表单设计器处理,您通常在这里不写任何内容:修改表单设计后,它将立即删除。

自定义属性在这里称为 CustomDataSet
这里的代码还会下拉组合框列表,因此您可以查看已设置的内容。

这是它的工作方式:

Custom ComboBox Selector

Imports System.ComponentModel

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

    Public Enum DataSelector
        None = 0
        Set1
        Set2
    End Enum

    Private Selector As DataSelector = DataSelector.None
    Public Sub New()
        MyBase.New()
    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 Me.DesignMode Then Me.DroppedDown = True
    End Sub

End Class