具有值的自定义组合框
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
我有一个 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