2016-12-05 6 views
0

私はArrayListsとStructuresに慣れさせるためにVBでプログラミングを割り当てています。私はこのatmを行うための最善の方法はリストを使用することであることを理解していますが、教授は構造を持つarraylistsを使って私に望みます。私は構造としてarraylistに保存されている顧客の詳細(名前、アカウント#、残高)を入力する必要があるフォームアプリケーションがあります。このプログラムでは、ユーザーがアカウントを変更した後、「次へ」または「前の」ボタンを押してページを閉じると、arraylistには変更が加えられます。これは私のプログラムでこれまでに得たところです。 [次へ]または[前へ]をクリックすると、プログラムがクラッシュし、残高のアカウントで次のエラーが表示されます。文字列から "Double"を入力する変換は無効です。私はテキストボックスから倍精度浮動小数点型の整数を受け入れない理由を理解していません。構造体をArrayListに適切に挿入するにはどうすればよいですか?

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 
+0

あなたのコードをダンプし、何か間違ったものが見つかることを期待して私たちがそれを辿ることを期待して、ここで私は恐れます。 SOは特定の質問のためのものです。期待どおりに動作していないものを正確に切り分け、関連するコードだけを含む完全かつ明確な説明を提供するのはあなた次第です。どのようなエラーメッセージが表示されているのか、どのような動作が見えているのか、どのような動作が期待通りに異なるのかを説明する必要があります。あなたがそれを行うことができない場合、ここに投稿するのは時期尚早です。 – jmcilhinney

+0

私の質問は、問題がボタンをクリックすると、次と前のいずれかをクリックするとすぐにプログラムがクラッシュし、「文字列からの変換」が「ダブル」残高口座に「有効ではありません」と表示されます。 –

+0

そうではありませんでした。あなたはそれが必須だと言いましたが、それはうまくいかないとは言わず、特定のエラーメッセージが出ているとは言いませんでした。これは私達が推測しなければならないものではありません。質問を編集して無関係なコードをすべて削除し、関連していない情報をすべて追加してください。助けたい人は、必要なものを見つけるためにコメントを読む必要はありません。 – jmcilhinney

答えて

0

ここでの問題は、例外が説明しているとおり、文字列を数値に正しく変換することではありません。 "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 

この未処理の例外はもう発生しません。キャッチブロックでは、あなたが行ったようなメッセージボックスを表示するか、上記のように値を0に設定することができます。将来、コードの最初の行にのOption Strictをと追加することをお勧めします。それがなければ暗黙的な変換が行われますが、これはString = Nothingのときに遭遇したような例外のための扉を開きます。このオプションをオンにすると、間違って行っているコンバージョンがVisual Studioで強調表示/下線表示されます。これらのタイプの作業を明示的かつ強力に入力することがベストプラクティスです。それほど驚きは少ないので、入るのはいい習慣です。

関連する問題