我正在尝试创建一个我可以在填充Listbox
或Combobox
时调用的单个函数。我遇到的问题是我收到错误:
"Items is not a member of System.Windows.Forms.ListControl"
。
单独地,在代码中,.items
是每个人的成员(Listbox
或Combobox
)。
这是当前的破碎功能:
Public Function AutoAddWindowsViewers(ByVal ctlControl As ListControl)
' Auto-add Notepad to the list
Dim strAutoAdd As String = Environment.GetEnvironmentVariable("WINDIR") & "\Notepad.exe"
If FileIO.FileSystem.FileExists(strAutoAdd) = True AndAlso ctlControl.Items.Contains(strAutoAdd) = False Then ctlControl.Items.Add(strAutoAdd)
' Auto-add Wordpad to the list
strAutoAdd = My.Computer.FileSystem.SpecialDirectories.ProgramFiles & "\Windows NT\Accessories\wordpad.exe"
If FileIO.FileSystem.FileExists(strAutoAdd) = True AndAlso ctlControl.Items.Contains(strAutoAdd) = False Then ctlControl.Items.Add(strAutoAdd)
End Function
我也尝试使用参数中更通用的ListControl
替换Control
,但会收到相同的错误。
我错过了什么?
更新,解决方案:
在@Bjørn-RogerKringsjå和@Tony Hopkinson的帮助下,这就是我最终写作的目的:
Public Sub AutoAddWindowsViewers(ByVal ctlControl As IList)
' Auto-add Notepad to the list
Dim strAutoAdd As String = Environment.GetEnvironmentVariable("WINDIR") & "\Notepad.exe"
If FileIO.FileSystem.FileExists(strAutoAdd) = True AndAlso ctlControl.Contains(strAutoAdd) = False Then ctlControl.Add(strAutoAdd)
' Auto-add Wordpad to the list
strAutoAdd = My.Computer.FileSystem.SpecialDirectories.ProgramFiles & "\Windows NT\Accessories\wordpad.exe"
If FileIO.FileSystem.FileExists(strAutoAdd) = True AndAlso ctlControl.Contains(strAutoAdd) = False Then ctlControl.Add(strAutoAdd)
End Sub
要调用它,我只需传递Control .items
:
即。 AutoAddWindowsViewers(cboComboBox1.items)
答案 0 :(得分:0)
属性Items不包含在Control或ListControl对象中。
如果将参数ctlControl
的数据类型从ListControl更改为Object,则代码将起作用。但是,这可能会使代码在将来出现错误,因此检查ctlControl
的数据类型是个好主意:
If TypeOf (ctlControl) Is ListBox Or TypeOf (ctlControl) Is ComboBox Then
答案 1 :(得分:0)
正如Tony Hopkinson所述,如果您只是将参数更改为IList
会更好。然后,每当调用该函数时,都传递对象集合(Items)。
该函数不返回任何内容,因此它应该是一个子例程。
Public Sub AutoAddWindowsViewers(ByVal control As ListControl)
If (control Is Nothing) Then Throw New ArgumentNullException("control")
创建一个变量来保存列表。
Dim list As IList = Nothing
检查列表控件是否绑定到数据源。列表控件的DataSource属性接受两种类型的数据:IList和IListSource。
If (Not control.DataSource Is Nothing) Then
If (TypeOf control.DataSource Is IList) Then
list = DirectCast(control.DataSource, IList)
ElseIf (TypeOf control.DataSource Is IListSource) Then
list = DirectCast(control.DataSource, IListSource).GetList()
End If
End If
如果列表仍为null,请使用对象集合。
If (list Is Nothing) Then
If (TypeOf control Is ListBox) Then
list = DirectCast(control, ListBox).Items
ElseIf (TypeOf control Is ComboBox) Then
list = DirectCast(control, ComboBox).Items
Else
Throw New ArgumentException("...a descriptive error message...")
End If
End If
请注意,如果列表不能保存字符串值,则会抛出ArgumentException
。
Dim item As String = Nothing
'Auto-add Notepad to the list
item = Environment.GetEnvironmentVariable("WINDIR") & "\Notepad.exe"
If (FileIO.FileSystem.FileExists(item) AndAlso (Not list.Contains(item))) Then list.Add(item)
'Auto-add Wordpad to the list
item = My.Computer.FileSystem.SpecialDirectories.ProgramFiles & "\Windows NT\Accessories\wordpad.exe"
If (FileIO.FileSystem.FileExists(item) AndAlso (Not list.Contains(item))) Then list.Add(item)
End Sub