首页 > 解决方案 > 具有值的自定义组合框

问题描述

我有一个包含相同组合框的多个表单的 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 的评论,我创建了这个类

 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. 

我错过了一些东西,但我不知道它是什么。
谢谢你的帮助。

标签: vb.netwinformscombobox

解决方案


您可以添加一个接受 Enumerator(甚至是字符串值,如您在此处所做的那样)的公共属性,而不是使用类 Constructor(如果您想在设计器中创建控件,这不是很有用)允许您在设计时定义属性值更改时的预定义数据集。

请注意,请避免篡改 Designer.vb 代码。它由表单设计器处理,您通常不会在这里写任何东西:一旦表单设计被修改,它就会被删除。

自定义属性CustomDataSet在这里被称为 。
此处的代码还下拉了 ComboBox List,因此您可以查看已设置的内容。

这是它的工作原理:

自定义组合框选择器

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()
        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 DesignMode Then Me.DroppedDown = True
    End Sub
End Class

推荐阅读