我有一个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.
我丢失了一些东西,但我不知道它是什么。
感谢您的帮助。
答案 0 :(得分:2)
您可以添加一个接受Enumerator(甚至是String值)的Public属性来代替使用类Constructor(如果要在Designer中创建控件的用处不大)。这里),您可以在设计时定义更改属性值时的预定义数据集。
请注意,避免篡改Designer.vb代码。它由表单设计器处理,您通常在这里不写任何内容:修改表单设计后,它将立即删除。
自定义属性在这里称为 CustomDataSet
。
这里的代码还会下拉组合框列表,因此您可以查看已设置的内容。
这是它的工作方式:
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