将列表框或组合框作为控件传递给函数?
Pass a Listbox or Combobox as a control to a function?
我正在尝试创建一个可以在填充 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
我也试过用参数中更通用的 Control
替换 ListControl
,但得到了同样的错误。
我错过了什么?
更新,解决方案:
在@Bjørn-Roger Kringsjå 和@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
为了调用它,我只传递了控件的 .items
:
即AutoAddWindowsViewers(cboComboBox1.items)
属性 项未包含在 Control 或 ListControl 对象中。
如果您将参数 ctlControl
的数据类型从 ListControl 更改为 Object,该代码将起作用。但是,这会使代码在将来容易出错,因此最好检查 ctlControl
:
的数据类型
If TypeOf (ctlControl) Is ListBox Or TypeOf (ctlControl) Is ComboBox Then
正如Tony Hopkinson所述,如果您将参数更改为IList
会更好。然后,每当您调用该函数时,传递对象集合 (Items)。
该函数没有return任何东西,所以它应该是一个子例程。
Public Sub AutoAddWindowsViewers(ByVal control As ListControl)
If (control Is Nothing) Then Throw New ArgumentNullException("control")
创建一个变量来保存列表。
Dim list As IList = Nothing
检查列表控件是否绑定到数据源。 DataSource property of a list control accepts two types of data: IList and 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
如果列表仍然为空,请使用对象集合。
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
我正在尝试创建一个可以在填充 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
我也试过用参数中更通用的 Control
替换 ListControl
,但得到了同样的错误。
我错过了什么?
更新,解决方案:
在@Bjørn-Roger Kringsjå 和@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
为了调用它,我只传递了控件的 .items
:
即AutoAddWindowsViewers(cboComboBox1.items)
属性 项未包含在 Control 或 ListControl 对象中。
如果您将参数 ctlControl
的数据类型从 ListControl 更改为 Object,该代码将起作用。但是,这会使代码在将来容易出错,因此最好检查 ctlControl
:
If TypeOf (ctlControl) Is ListBox Or TypeOf (ctlControl) Is ComboBox Then
正如Tony Hopkinson所述,如果您将参数更改为IList
会更好。然后,每当您调用该函数时,传递对象集合 (Items)。
该函数没有return任何东西,所以它应该是一个子例程。
Public Sub AutoAddWindowsViewers(ByVal control As ListControl)
If (control Is Nothing) Then Throw New ArgumentNullException("control")
创建一个变量来保存列表。
Dim list As IList = Nothing
检查列表控件是否绑定到数据源。 DataSource property of a list control accepts two types of data: IList and 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
如果列表仍然为空,请使用对象集合。
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