将Listbox或Combobox作为控件传递给函数?

时间:2015-01-21 20:50:00

标签: vb.net combobox listbox

我正在尝试创建一个我可以在填充ListboxCombobox时调用的单个函数。我遇到的问题是我收到错误:

"Items is not a member of System.Windows.Forms.ListControl"

单独地,在代码中,.items 是每个人的成员(ListboxCombobox)。

这是当前的破碎功能:

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)

2 个答案:

答案 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属性接受两种类型的数据:IListIListSource

    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