【问题标题】:Use directcast to call a list使用 directcast 调用列表
【发布时间】:2014-10-30 17:17:04
【问题描述】:

我正在寻找一种方法来避免使用 select case 来访问特定列表;我将在一个模块上有大约 90 个列表,并且取决于在列表框中选择的记录(手动填充我的数据库中大多数表的名称,但不是全部)我需要阅读列表中的项目.所以我有这样的事情:

Public RelevantTables_Table001 As List(Of Table001) = New List(Of Table001)
Public RelevantTables_Table002 As List(Of Table002) = New List(Of Table002)
'...
Public RelevantTables_Table999 As List(Of Table999) = New List(Of Table999)

Class Table001
'code for populating RelevantTables_Table001
End Class

Class Table002
'code for populating RelevantTables_Table002
End Class

Class Table999
'code for populating RelevantTables_Table999
End Class

现在我需要阅读相关列表,具体取决于在列表框中选择的项目。例如,如果有人选择Table042,我需要阅读列表中的项目RelevantTables_Table042

我正在尝试为此使用 DirectCast,但我不知道该怎么做。

【问题讨论】:

  • 你是如何填充列表框的?用它更新你的帖子。
  • 现在,手动;列表框列出了我数据库中的大部分表。
  • Reflection 是一种可能性,因为您可以创建一个 "RelevantTables_" & lsb.Text = RelevantTables_Table001 的字符串,这将是该字段的名称。
  • 了解一下这些东西是什么会有所帮助。 List(Of Table002) 是真正的 Table002 对象列表还是 for 新 Table2 对象的列表?表类是否使用继承?
  • 我正在阅读有关如何为此使用反射的信息,我只使用它来访问我之前创建的一些 dll。 List(Of Table002) 实际上是 Table002 对象的列表;在加载时,我运行类似 RelevantTables_Table002.Add(New Table002("NameOfTable", "IDfield", "Table Name Alias")) 的东西来用我想要的字符串填充所有列表对象。我只是想找到一种方法来调用列表,而不是用他的名字,而是使用一个变量:读取列表“RelevantTables_”和lsb.Text

标签: vb.net list directcast


【解决方案1】:

类:

Public Class Table
  Public Tablename As String
  Public Collection As New List(Of String)
  Public Overrides Function ToString() As String
    Return Me.TableName
  End Function
End Class

创建新列表:

Private RelevantTable_Table001 As New Table
RelevantTable_Table001.Tablename = "Table001"
RelevantTable_Table001.Collection.Add("stuff")
...
'add the class and it will display the TableName since we 
'overrided the ToString function 
lsb.Items.Add(RelevantTable_Table001)
'class objects can be stored in the listbox as an object

SelectedItem 属性中获取 List 对象。

Private Sub lsb_SelectedIndexChanged(sender As Object, e As EventArgs)
  Dim tableList = TryCast(DirectCast(sender, ListBox).SelectedItem, Table)
  If tableList IsNot Nothing Then
    'tableList is the reference to the table object you seek.
  End If
End Sub

要创建一个包含多个对象(DGV 中的列)的列表,请使用自定义类:

Public Class MyCustomClass
  Public Property Prop1 As String
  Public Property Prop2 As String
  Public Property Prop3 As String
End Class

那么您的 Table.Collection 将是 List(Of MyCustomClass) 而不是字符串,这将为每个集合项目提供 3 个项目 - 这是一个表格。这符合您的需求吗?

【讨论】:

  • 非常感谢,这正是我想要的 :) 最后一个问题可以麻烦您吗?如果我可以创建包含多列的列表(我需要 3 个),那将对我有很大帮助。我有代码可以做到这一点,我正在尝试将它应用于您提供的代码。除此之外,再次感谢你们的热心帮助
  • @user3050422,这样可以吗?
  • 完全 OneFineDay,我已经解决了这个问题。非常感谢你,伙计,你在这里真的帮助了我:)
【解决方案2】:

制作列表的列表,然后使用下标访问正确的列表,如

Public RelevantTables As List(Of List(Of table)) 

For Each item in RelevantTables(42)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多