【问题标题】:How can I properly insert structures into an ArrayList?如何正确地将结构插入 ArrayList?
【发布时间】:2016-12-05 04:37:56
【问题描述】:

我有一个 VB 编程任务,让我习惯了 ArrayLists 和 Structures。我知道执行此操作的最佳方法是使用列表,但教授希望我使用具有结构的数组列表。我有一个表单应用程序,它要求用户输入客户详细信息(姓名、帐户编号、余额),并将其作为结构保存到数组列表中。该程序要求,如果用户对帐户进行了更改,然后按“下一个”或“上一个”按钮离开,arraylist 将使用所做的更改进行更新。这是我到目前为止在我的程序中得到的地方。当我单击 Next 或 Previous 时,程序崩溃,并且余额帐户从字符串“”转换为“Double”无效时收到以下错误。我不明白为什么它不接受文本框中的双精度或整数,在保存和添加潜艇时它工作正常。

Public Class AccountInformationForm

    Dim objaccount As account
    Dim accounts As New ArrayList
    Dim count As Integer

    Public Structure account

        Public RecordNum As Integer
        Public FirstName As String
        Public LastName As String
        Public balance As Double
        Public account As Integer
    End Structure

    Private Sub AccountInformationForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        count = 0
        objaccount.RecordNum = 0
        objaccount.FirstName = "Jesus"
        objaccount.LastName = "Christ"
        objaccount.balance = 100
        objaccount.account = 1

        accounts.Add(objaccount)


        'Display First Record
        firstTextBox.Text = objaccount.FirstName
        lastTextBox.Text = objaccount.LastName
        balanceTextBox.Text = objaccount.balance
        accountTextBox.Text = objaccount.account



    End Sub


    Private Sub nextButton_Click(sender As Object, e As EventArgs) Handles nextButton.Click

        objaccount.FirstName = firstTextBox.Text
        objaccount.LastName = lastTextBox.Text
        objaccount.balance = balanceTextBox.Text
        objaccount.account = accountTextBox.Text

        accounts.Insert(count, objaccount)


        count += 1

        If count > (accounts.Count - 1) Then
            count = 0

        End If

        'Display Current Record
        firstTextBox.Text = accounts(count).FirstName
        lastTextBox.Text = accounts(count).LastName
        balanceTextBox.Text = accounts(count).balance
        accountTextBox.Text = accounts(count).account

    End Sub


    Private Sub previousButton_Click(sender As Object, e As EventArgs) Handles previousButton.Click
        'Before paging away, save the current form data in the current record
        objaccount.FirstName = firstTextBox.Text
        objaccount.LastName = lastTextBox.Text
        objaccount.balance = balanceTextBox.Text
        objaccount.account = accountTextBox.Text

        accounts.Insert(count, objaccount)

        count -= 1

        If count < 0 Then
            count = accounts.Count - 1
        End If



        firstTextBox.Text = accounts(count).FirstName
        lastTextBox.Text = accounts(count).LastName
        balanceTextBox.Text = accounts(count).balance
        accountTextBox.Text = accounts(count).account

    End Sub

    Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click

        Dim upper As Integer = accounts.Count
        objaccount.RecordNum = (upper + 1)



        If firstTextBox.Text = "" Then
            MsgBox("Please enter a name")
        Else
            objaccount.FirstName = firstTextBox.Text
        End If

        If lastTextBox.Text = "" Then
            MsgBox("Please enter a name")
        Else
            objaccount.LastName = lastTextBox.Text
        End If

        If balanceTextBox.Text = "" Then
            MsgBox("Please enter a name")
        Else
            objaccount.balance = balanceTextBox.Text
        End If

        If accountTextBox.Text = "" Then
            MsgBox("Please enter a name")
        Else
            objaccount.account = accountTextBox.Text
        End If

        accounts.Add(objaccount)


        firstTextBox.Clear()
        lastTextBox.Clear()
        balanceTextBox.Clear()
        accountTextBox.Clear()

    End Sub

    Private Sub Save_Click(sender As Object, e As EventArgs) Handles Save.Click


        If firstTextBox.Text = "" Then
            MsgBox("Please enter a name")
        Else
            objaccount.FirstName = firstTextBox.Text
        End If

        If lastTextBox.Text = "" Then
            MsgBox("Please enter a name")
        Else
            objaccount.LastName = lastTextBox.Text
        End If

        If balanceTextBox.Text = "" Then
            MsgBox("Please enter a name")
        Else
            objaccount.balance = balanceTextBox.Text
        End If

        If accountTextBox.Text = "" Then
            MsgBox("Please enter a name")
        Else
            objaccount.account = accountTextBox.Text
        End If

        accounts.Add(objaccount)


    End Sub

    Private Sub btnNew_Click(sender As Object, e As EventArgs) Handles btnNew.Click
        firstTextBox.Clear()
        lastTextBox.Clear()
        balanceTextBox.Clear()
        accountTextBox.Clear()


        Dim upper As Integer = accounts.Count
        objaccount.RecordNum = (upper + 1)
        accountTextBox.Text = objaccount.RecordNum

    End Sub

    Private Sub btnDelete_Click(sender As Object, e As EventArgs) Handles btnDelete.Click
        accounts.RemoveAt(count)

        count = count - 1
        firstTextBox.Text = accounts(count).FirstName
        lastTextBox.Text = accounts(count).LastName
        balanceTextBox.Text = accounts(count).balance
        accountTextBox.Text = accounts(count).account

    End Sub
End Class

【问题讨论】:

  • 只是转储你的代码并期望我们通过它来寻找错误的希望在这里我是不可接受的。 SO 是针对特定问题的。您可以准确地隔离出没有按预期工作的内容,并提供完整且清晰的解释,其中仅包括相关代码。您需要告诉我们您收到什么错误消息以及在哪里收到,或者解释您看到的行为以及它与您的预期有何不同。如果你不能这样做,那么在这里发布还为时过早。
  • 我认为我的问题足够详细,可以指出问题在于按钮单击下一个和上一个的子按钮,只要我单击下一个或上一个,程序就会崩溃并且我得到“转换自余额帐户上的字符串“”键入“双”无效”。
  • 不是。您说这是一项要求,但您没有说这不起作用,您当然没有说您收到了特定的错误消息。这不是我们应该猜测的东西。请编辑您的问题并删除所有不相关的代码并添加所有缺少的相关信息。其他想要帮助的人不必通过 cmets 找到他们需要的东西。
  • 至于问题,错误信息告诉你所有你需要知道的。您正在尝试将 String 转换为 DoubleString 为空。现在由您来调试并确定发生这种情况的原因。 VS 是一个 IDE,而不是文本编辑器,所以不要仅仅将它用作文本编辑器。调试你的代码。使用断点。单步执行并在代码执行时检查您的数据。

标签: arrays vb.net arraylist structure


【解决方案1】:

您的问题与异常描述的完全一样,您没有正确地将字符串转换为数字。 Add/Save subs 起作用的原因是您首先检查 .Text "" ,因此不是最终尝试将字符串转换为数字格式,而是提示用户输入数据,因此永远不会进行转换尝试过,所以不会抛出异常。

如果您更改以下所有出现的情况:

balanceTextBox.Text = accounts(count).balance
accountTextBox.Text = accounts(count).account

到:

balanceTextBox.Text = accounts(count).balance.ToString
accountTextBox.Text = accounts(count).account.ToString

并且反过来,更改所有出现的以下内容:

objaccount.balance = balanceTextBox.Text
objaccount.account = accountTextBox.Text

类似于:

Try
    objaccount.balance = Convert.ToDouble(balanceTextBox.Text)
Catch ex As Exception
    objaccount.balance = 0
End Try
Try
    objaccount.account = Convert.ToInt32(accountTextBox.Text)
Catch ex As Exception
    objaccount.account = 0
End Try

那么您将不再收到未处理的异常。在 catch 块中,您可以像您一直在做的那样显示一个消息框,或者只是将值设置为 0,如上所示。以后,我建议您将 Option Strict On 添加为代码的第一行。没有它,将为您完成隐式转换,但这也为您在 String = Nothing 时遇到的异常打开了大门。如果您打开该选项,您所做的任何错误转换都将在 Visual Studio 中突出显示/加下划线。最好的做法是明确地执行这些类型的事情并强烈键入您的代码;这样一来惊喜就少了,所以养成一个好习惯。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    相关资源
    最近更新 更多