【问题标题】:Loop through class objects - Visual basic循环遍历类对象 - Visual basic
【发布时间】:2015-03-08 06:42:15
【问题描述】:

如何在 vb.net 中循环遍历一个类的所有对象,而不是如下所示。我想在代码中初始化我的类对象(这是一个示例),然后通过它们进行一个 for each 循环而不是底部的代码。

    'Angiv 1. saldo, 2. Navn, 3. CPR nummer, 4. pinkode
Dim Kunde1 As New Kunde(1010, "Mads Peter Petersen", "010190-0000", 1111)
Dim Kunde2 As New Kunde(2020, "John Pedersen", "010190-0001", 2222)
Dim Kunde3 As New Kunde(3030, "Flemming Farsø", "010190-0002", 3333)
Dim Kunde4 As New Kunde(4040, "Didrich Rich", "010190-0003", 4444)
Dim Kunde5 As New Kunde(5050, "Tobias Larsen", "010190-0004", 5555)
Dim aktivKunde As Kunde


Private Sub Main()
    btn100.Enabled = False
    btn200.Enabled = False
    btn500.Enabled = False
    btn1000.Enabled = False
    btnGodkend.Enabled = False
    btnVisbevaegelser.Enabled = False
End Sub


Private Sub btnTjek_Click(sender As Object, e As EventArgs) Handles btnTjek.Click


    If Kunde1.Tjek(CInt(txtPinkode.Text), CInt(txtCpr.Text.Substring(txtCpr.Text.Length - 4))) Then
        txtSaldo.Text = Kunde1.Saldo
        txtNavn.Text = Kunde1.Navn
        aktivKunde = Kunde1
        AktiverKnapper()


    ElseIf Kunde2.Tjek(CInt(txtPinkode.Text), CInt(txtCpr.Text.Substring(txtCpr.Text.Length - 4))) Then
        txtSaldo.Text = Kunde2.Saldo
        txtNavn.Text = Kunde2.Navn
        aktivKunde = Kunde2
        AktiverKnapper()


    ElseIf Kunde3.Tjek(CInt(txtPinkode.Text), CInt(txtCpr.Text.Substring(txtCpr.Text.Length - 4))) Then
        txtSaldo.Text = Kunde3.Saldo
        txtNavn.Text = Kunde3.Navn
        aktivKunde = Kunde3
        AktiverKnapper()


    ElseIf Kunde4.Tjek(CInt(txtPinkode.Text), CInt(txtCpr.Text.Substring(txtCpr.Text.Length - 4))) Then
        txtSaldo.Text = Kunde4.Saldo
        txtNavn.Text = Kunde4.Navn
        aktivKunde = Kunde4
        AktiverKnapper()


    ElseIf Kunde5.Tjek(CInt(txtPinkode.Text), CInt(txtCpr.Text.Substring(txtCpr.Text.Length - 4))) Then
        txtSaldo.Text = Kunde5.Saldo
        txtNavn.Text = Kunde5.Navn
        aktivKunde = Kunde5
        AktiverKnapper()

    Else : MessageBox.Show("Der var desværre ingen kunder med dette CPR-nummer & pinkode", "Forkert pinkode eller CPR-nummer")
    End If

【问题讨论】:

    标签: vb.net class loops object


    【解决方案1】:

    最简单的就是使用集合/列表:

    ' declare the list var AND create an instance of it (these are objects)
    Private myKunde As New List(of Kunde)
    
     ...
    myKunde.Add(New Kunde(1010, "Mads Peter Petersen", "010190-0000", 1111))
    myKunde.Add(New Kunde(2020, "John Pedersen", "010190-0001", 2222))
    ... etc
    

    循环:

    For Each k As Kunde In myKunde 
       Console.WriteLine(k.Name)           ' ??
    Next
    

    引用一个特定的:

    Console.WriteLine(myKunde(1).Name)   
    ' remove Kunde John:
    myKunde.RemoveAt(1)
    
    ' start over:
    myKunde.Clear 
    

    在 ListBox 中显示列表的整个内容:

    lbKunde.DataSource = myKunde
    

    如果 Kunde 覆盖 ToString(),这就是每个项目将显示的内容。

    它们就像一个数组,只是您不必提前知道它有多大,只需向其中添加项目即可。 List(of T) 有很多其他方法,例如SortReverse,您还可以在其上使用扩展方法并查询集合。

    按钮点击(无法翻译它所说的)可能是这样的:

    Sub btnClick(....
      Dim Kindex As Integer
    
      ' this might be able to be reduced more, I dont know what they are
      ' a LISTBOX would certainly get rid of it
      If Kunde1.Tjek Then
          Kindex = 1
      ElseIf Kunde2.Tjek
          Kindex = 2
      ...
    
      DisplayKunde(KIndex)
      ...
    
    Private Sub DisplayKinde(ndx As integer)
        ' display desired Kunde to txt controls
        txtBox1.Text = myKunde(ndx).Name      ' ? no idea whats in Kinde
        txtBox2.Text = myKunde(ndx).Foo
        txtBox3.Text = myKunde(ndx).Bar
        ...
    End Sub
    

    【讨论】:

    • 在我的每个循环中,我不能写“.. In myKunde”?它说它没有声明?
    • 第一行代码声明了并且创建了一个实例;如果这是表单中的代码,请确保它在任何 SUB 之外
    • 我就不能这样吗?但它不像以前那样工作?对于每个 kundeNavn 作为 Kunde 在 kundeListe 如果 kundeNavn.Tjek(CInt(txtPinkode.Text), CInt(txtCpr.Text.Substring(txtCpr.Text.Length - 4))) 那么 txtSaldo.Text = kundeNavn.Saldo txtNavn.Text = kundeNavn .Navn aktivKunde = kundeNavn AktiverKnapper() Else : MessageBox.Show("Der var desværre ingen kunder med dette CPR-nummer & pinkode", "Forkert pinkode eller CPR-nummer") End If
    • 抱歉,我无法阅读/理解其中的任何内容,所以我不知道您要做什么。不过,看起来您并没有使用索引器。 Navn 似乎是一个属性,所以 For each k As Kunde in myKundeList // If k.Navn ... 可能是你想要的更多
    • 更新:如果我将 Kundeliste.Add.... 放在与 for each 循环相同的 sub 中,它会起作用 - 怎么会? :) P.s 谢谢你的帮助!!
    猜你喜欢
    • 1970-01-01
    • 2019-04-29
    • 2020-06-09
    • 1970-01-01
    • 2020-04-30
    • 2017-06-12
    • 2015-10-31
    • 2014-11-30
    • 1970-01-01
    相关资源
    最近更新 更多