将列表框或组合框作为控件传递给函数?

Pass a Listbox or Combobox as a control to a function?

我正在尝试创建一个可以在填充 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

我也试过用参数中更通用的 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