vb.net - 具有值的自定义组合框
问题描述
我有一个包含相同组合框的多个表单的 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.
我错过了一些东西,但我不知道它是什么。
谢谢你的帮助。
解决方案
您可以添加一个接受 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
推荐阅读
- python - Python:数字太大了吗?
- python - 列表索引超出范围,我不知道为什么?
- python - 在链表中选择偶数并制作它们的子部分
- jenkins - 如何防止矩阵构建在 Jenkins 管道中共享相同的工作区?
- r - 在R中查找相关性大于k的子串
- powershell - 在 PowerShell 中解析 Windows Defender 事件日志
- xcode - zsh:找不到命令:pod
- php - 如何在 Codeigniter 4 中使用 WHERE CLAUSE
- asp.net - Web API - 需要一种方法来返回多部分表单数据作为响应
- git - 如何在 PhpStorm 终端中显示项目路径后的分支名称