I am working on importing data from a text file where one piece of data automatically populates the listview box and the other piece of data is held in memory until a user selects the appliance that shows in the listview box. The text file has appliance name on first line then power on second line. This repeats. What should happen is when the form loads the listview box should show the appliances that are in the text file. A use will select the appliance from the list and the appliance name and power will display in the textboxes. Any help would be greatly appreciated. I have been working on this program for weeks trying to learn VB 2010.
Imports System.IO
Public Class frmMain
Public Structure ApplianceRecord
Dim strApplianceName As String
Dim strApplianceCost As String
Dim strAppliancePower As String
Dim strApplianceHours As String
Dim strApplianceWater As String
Dim strApplianceWaterCost As String
Dim strApplianceResult As String
End Structure
Dim Appliance() As ApplianceRecord
Dim ApplianceIndex As Integer
Private Sub AddEntry(ByVal Index As Integer)
'AddEntry transfers the data in the textboxes to the Next Appliance Record Structure
Dim strData As String
Dim ApplianceNameOnly As String
ApplianceNameOnly = Appliance(ApplianceIndex).strApplianceName
strData = Appliance(ApplianceIndex).strApplianceName + _
Appliance(ApplianceIndex).strApplianceCost + _
Appliance(ApplianceIndex).strAppliancePower + _
Appliance(ApplianceIndex).strApplianceHours + _
Appliance(ApplianceIndex).strApplianceWater + _
Appliance(ApplianceIndex).strApplianceWaterCost + _
Appliance(ApplianceIndex).strApplianceResult
lstDisplay.Items.Add(ApplianceNameOnly)
'Adds records to the ListView box
Dim li As New ListViewItem
li = lstTotal.Items.Add(Appliance(ApplianceIndex).strApplianceName)
li.SubItems.Add(Appliance(ApplianceIndex).strApplianceCost)
li.SubItems.Add(Appliance(ApplianceIndex).strAppliancePower)
li.SubItems.Add(Appliance(ApplianceIndex).strApplianceHours)
li.SubItems.Add(Appliance(ApplianceIndex).strApplianceWater)
li.SubItems.Add(Appliance(ApplianceIndex).strApplianceWaterCost)
li.SubItems.Add(Appliance(ApplianceIndex).strApplianceResult)
End Sub
Private Sub ValidateData()
Dim strName As String
strName = txtName.Text
If strName = "" Then
MessageBox.Show("Please enter the name of the appliance")
txtName.Clear()
txtName.Focus()
' Generates the "show" of the statements and fields for water if txtName meets certain text
End If
Dim strCost As String
strCost = txtCost.Text
If strCost = "" Then
MessageBox.Show("Please enter the cost per kilowatt")
txtCost.Clear()
txtCost.Focus()
End If
Dim strPower As String
strPower = txtPower.Text
Try 'Validates the entered data for txtPower.Text
strPower = Double.Parse(txtPower.Text)
Catch ex As Exception
MessageBox.Show("Enter a numeric value between 0 and 6.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
txtPower.Clear()
txtPower.Focus()
End Try
Dim strHours As String
strHours = txtHours.Text
Try 'Validates the entered data for txtHours.Text
strHours = Double.Parse(txtHours.Text)
Catch ex As Exception
MessageBox.Show("Enter a numeric value between 0 and 24.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
txtHours.Clear()
txtHours.Focus()
End Try
Dim strWater As String
strWater = txtWater.Text
Dim strWaterCost As String
strWaterCost = txtWaterCost.Text
Dim strResult As String
strResult = lblResult.Text
ReDim Preserve Appliance(ApplianceIndex)
Appliance(ApplianceIndex).strApplianceName = strName
Appliance(ApplianceIndex).strApplianceCost = strCost
Appliance(ApplianceIndex).strAppliancePower = strPower
Appliance(ApplianceIndex).strApplianceHours = strHours
Appliance(ApplianceIndex).strApplianceWater = strWater
Appliance(ApplianceIndex).strApplianceWaterCost = strWaterCost
Appliance(ApplianceIndex).strApplianceResult = strResult
AddEntry(ApplianceIndex)
ApplianceIndex += 1
End Sub
'Event generated by clicking on an item in the listbox
Private Sub lstDisplay_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstDisplay.SelectedIndexChanged
Dim Index As Integer
Index = lstDisplay.SelectedIndex
DisplaySelectedAppliance(Index)
End Sub
'Transfers data from Structure element to Textboxes
Private Sub DisplaySelectedAppliance(ByRef Index As Integer)
txtShowName.Text = Appliance(Index).strApplianceName
txtShowCost.Text = Appliance(Index).strApplianceCost
txtShowPower.Text = Appliance(Index).strAppliancePower
txtShowHours.Text = Appliance(Index).strApplianceHours
txtShowWater.Text = Appliance(Index).strApplianceWater
txtShowWaterCost.Text = Appliance(Index).strApplianceWaterCost
lblShowTotal.Text = Appliance(Index).strApplianceResult
End Sub
Private Sub btnClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClear.Click
'Clears the values of all input fields and hides the water statements/fields
txtName.Text = ""
txtCost.Text = ""
txtPower.Text = ""
txtHours.Text = ""
lblResult.Text = ""
lblWater.Hide()
lblWaterCost.Hide()
txtWater.Hide()
txtWaterCost.Hide()
End Sub
Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
Me.Close()
End Sub
Private Sub btnCalculate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCalculate.Click
'Variables used to convert text to string
Dim strCost As String
Dim strPower As String
Dim strHours As String
Dim strWater As String
Dim strWaterCost As String
'Associates the values of the text fields to the string variables
strCost = Val(txtCost.Text)
strPower = Val(txtPower.Text)
strHours = Val(txtHours.Text)
strWater = Val(txtWater.Text)
strWaterCost = Val(txtWaterCost.Text)
'Creates the variable to hold the result string
Dim decResult As Decimal
'Calculates the total cost to use an appliance based on user input
decResult = Val(strCost * strPower * strHours) + (strWater * strWaterCost)
'Associates the result string to the label field and formats result to currency
lblResult.Text = decResult.ToString("c")
End Sub
Private Sub btnAddItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAddItem.Click
ValidateData()
'Creates the total of cost as each record is added
Dim result As Decimal
Dim total As Decimal
result = lblResult.Text
total = total + result
lblGrandTotal.Text = total.ToString("c")
'Clears the values of all input fields and hides the water statements/fields
txtName.Text = ""
txtCost.Text = ""
txtPower.Text = ""
txtHours.Text = ""
lblResult.Text = ""
lblWater.Hide()
lblWaterCost.Hide()
txtWater.Hide()
txtWaterCost.Hide()
End Sub
Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' Hides the statements and fields for water and the cost of water on the add panel
lblWater.Hide()
lblWaterCost.Hide()
txtWater.Hide()
txtWaterCost.Hide()
Dim reader As New IO.StreamReader(OpenFileDialog1.FileName)
End Sub
Private Sub txtName_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtName.TextChanged
If txtName.Text = "Washer" Or txtName.Text = "washer" Or txtName.Text = "washing machine" Then
lblWater.Show()
lblWaterCost.Show()
txtWater.Show()
txtWaterCost.Show()
Exit Sub
End If
End Sub
Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
SaveFileDialog1.ShowDialog()
End Sub
Private Sub SaveFileDialog1_FileOk(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles SaveFileDialog1.FileOk
Dim writer As New IO.StreamWriter(SaveFileDialog1.FileName)
For i As Integer = 0 To lstTotal.Items.Count - 1
writer.Write(lstTotal.Items(i).Text)
For subItemIndex As Integer = 1 To lstTotal.Items(i).SubItems.Count - 1
writer.Write("|" & lstTotal.Items(i).SubItems(subItemIndex).Text)
Next
writer.Write(Environment.NewLine)
Next
writer.Close()
End Sub
Private Sub OpenFileDialog1_FileOk(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk
'Reads data file and imports data
Dim filepath As String = OpenFileDialog1.FileName
Dim inputstream As New IO.StreamReader(filepath)
Dim newstr(2) As String
Dim ApplianceNameOnly As String
Dim AppliancePower As String
'Read while there is no more to read
Do While inputstream.Peek <> -1
'Split each line containing Appliance Name and Power into the array
newstr = inputstream.ReadLine().Split("|")
'Assign the values to the variables
ApplianceNameOnly = newstr(0)
AppliancePower = newstr(1)
'Add to listview
Me.lstDisplay.Items.Add(ApplianceNameOnly)
Loop
inputstream.Close()
End Sub
End Class
Imports System.IO
Public Class frmMain
Public Structure ApplianceRecord
Dim strApplianceName As String
Dim strApplianceCost As String
Dim strAppliancePower As String
Dim strApplianceHours As String
Dim strApplianceWater As String
Dim strApplianceWaterCost As String
Dim strApplianceResult As String
End Structure
Dim Appliance() As ApplianceRecord
Dim ApplianceIndex As Integer
Private Sub AddEntry(ByVal Index As Integer)
'AddEntry transfers the data in the textboxes to the Next Appliance Record Structure
Dim strData As String
Dim ApplianceNameOnly As String
ApplianceNameOnly = Appliance(ApplianceIndex).strApplianceName
strData = Appliance(ApplianceIndex).strApplianceName + _
Appliance(ApplianceIndex).strApplianceCost + _
Appliance(ApplianceIndex).strAppliancePower + _
Appliance(ApplianceIndex).strApplianceHours + _
Appliance(ApplianceIndex).strApplianceWater + _
Appliance(ApplianceIndex).strApplianceWaterCost + _
Appliance(ApplianceIndex).strApplianceResult
lstDisplay.Items.Add(ApplianceNameOnly)
'Adds records to the ListView box
Dim li As New ListViewItem
li = lstTotal.Items.Add(Appliance(ApplianceIndex).strApplianceName)
li.SubItems.Add(Appliance(ApplianceIndex).strApplianceCost)
li.SubItems.Add(Appliance(ApplianceIndex).strAppliancePower)
li.SubItems.Add(Appliance(ApplianceIndex).strApplianceHours)
li.SubItems.Add(Appliance(ApplianceIndex).strApplianceWater)
li.SubItems.Add(Appliance(ApplianceIndex).strApplianceWaterCost)
li.SubItems.Add(Appliance(ApplianceIndex).strApplianceResult)
End Sub
Private Sub ValidateData()
Dim strName As String
strName = txtName.Text
If strName = "" Then
MessageBox.Show("Please enter the name of the appliance")
txtName.Clear()
txtName.Focus()
' Generates the "show" of the statements and fields for water if txtName meets certain text
End If
Dim strCost As String
strCost = txtCost.Text
If strCost = "" Then
MessageBox.Show("Please enter the cost per kilowatt")
txtCost.Clear()
txtCost.Focus()
End If
Dim strPower As String
strPower = txtPower.Text
Try 'Validates the entered data for txtPower.Text
strPower = Double.Parse(txtPower.Text)
Catch ex As Exception
MessageBox.Show("Enter a numeric value between 0 and 6.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
txtPower.Clear()
txtPower.Focus()
End Try
Dim strHours As String
strHours = txtHours.Text
Try 'Validates the entered data for txtHours.Text
strHours = Double.Parse(txtHours.Text)
Catch ex As Exception
MessageBox.Show("Enter a numeric value between 0 and 24.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
txtHours.Clear()
txtHours.Focus()
End Try
Dim strWater As String
strWater = txtWater.Text
Dim strWaterCost As String
strWaterCost = txtWaterCost.Text
Dim strResult As String
strResult = lblResult.Text
ReDim Preserve Appliance(ApplianceIndex)
Appliance(ApplianceIndex).strApplianceName = strName
Appliance(ApplianceIndex).strApplianceCost = strCost
Appliance(ApplianceIndex).strAppliancePower = strPower
Appliance(ApplianceIndex).strApplianceHours = strHours
Appliance(ApplianceIndex).strApplianceWater = strWater
Appliance(ApplianceIndex).strApplianceWaterCost = strWaterCost
Appliance(ApplianceIndex).strApplianceResult = strResult
AddEntry(ApplianceIndex)
ApplianceIndex += 1
End Sub
'Event generated by clicking on an item in the listbox
Private Sub lstDisplay_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstDisplay.SelectedIndexChanged
Dim Index As Integer
Index = lstDisplay.SelectedIndex
DisplaySelectedAppliance(Index)
End Sub
'Transfers data from Structure element to Textboxes
Private Sub DisplaySelectedAppliance(ByRef Index As Integer)
txtShowName.Text = Appliance(Index).strApplianceName
txtShowCost.Text = Appliance(Index).strApplianceCost
txtShowPower.Text = Appliance(Index).strAppliancePower
txtShowHours.Text = Appliance(Index).strApplianceHours
txtShowWater.Text = Appliance(Index).strApplianceWater
txtShowWaterCost.Text = Appliance(Index).strApplianceWaterCost
lblShowTotal.Text = Appliance(Index).strApplianceResult
End Sub
Private Sub btnClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClear.Click
'Clears the values of all input fields and hides the water statements/fields
txtName.Text = ""
txtCost.Text = ""
txtPower.Text = ""
txtHours.Text = ""
lblResult.Text = ""
lblWater.Hide()
lblWaterCost.Hide()
txtWater.Hide()
txtWaterCost.Hide()
End Sub
Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
Me.Close()
End Sub
Private Sub btnCalculate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCalculate.Click
'Variables used to convert text to string
Dim strCost As String
Dim strPower As String
Dim strHours As String
Dim strWater As String
Dim strWaterCost As String
'Associates the values of the text fields to the string variables
strCost = Val(txtCost.Text)
strPower = Val(txtPower.Text)
strHours = Val(txtHours.Text)
strWater = Val(txtWater.Text)
strWaterCost = Val(txtWaterCost.Text)
'Creates the variable to hold the result string
Dim decResult As Decimal
'Calculates the total cost to use an appliance based on user input
decResult = Val(strCost * strPower * strHours) + (strWater * strWaterCost)
'Associates the result string to the label field and formats result to currency
lblResult.Text = decResult.ToString("c")
End Sub
Private Sub btnAddItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAddItem.Click
ValidateData()
'Creates the total of cost as each record is added
Dim result As Decimal
Dim total As Decimal
result = lblResult.Text
total = total + result
lblGrandTotal.Text = total.ToString("c")
'Clears the values of all input fields and hides the water statements/fields
txtName.Text = ""
txtCost.Text = ""
txtPower.Text = ""
txtHours.Text = ""
lblResult.Text = ""
lblWater.Hide()
lblWaterCost.Hide()
txtWater.Hide()
txtWaterCost.Hide()
End Sub
Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' Hides the statements and fields for water and the cost of water on the add panel
lblWater.Hide()
lblWaterCost.Hide()
txtWater.Hide()
txtWaterCost.Hide()
Dim reader As New IO.StreamReader(OpenFileDialog1.FileName)
End Sub
Private Sub txtName_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtName.TextChanged
If txtName.Text = "Washer" Or txtName.Text = "washer" Or txtName.Text = "washing machine" Then
lblWater.Show()
lblWaterCost.Show()
txtWater.Show()
txtWaterCost.Show()
Exit Sub
End If
End Sub
Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
SaveFileDialog1.ShowDialog()
End Sub
Private Sub SaveFileDialog1_FileOk(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles SaveFileDialog1.FileOk
Dim writer As New IO.StreamWriter(SaveFileDialog1.FileName)
For i As Integer = 0 To lstTotal.Items.Count - 1
writer.Write(lstTotal.Items(i).Text)
For subItemIndex As Integer = 1 To lstTotal.Items(i).SubItems.Count - 1
writer.Write("|" & lstTotal.Items(i).SubItems(subItemIndex).Text)
Next
writer.Write(Environment.NewLine)
Next
writer.Close()
End Sub
Private Sub OpenFileDialog1_FileOk(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk
'Reads data file and imports data
Dim filepath As String = OpenFileDialog1.FileName
Dim inputstream As New IO.StreamReader(filepath)
Dim newstr(2) As String
Dim ApplianceNameOnly As String
Dim AppliancePower As String
'Read while there is no more to read
Do While inputstream.Peek <> -1
'Split each line containing Appliance Name and Power into the array
newstr = inputstream.ReadLine().Split("|")
'Assign the values to the variables
ApplianceNameOnly = newstr(0)
AppliancePower = newstr(1)
'Add to listview
Me.lstDisplay.Items.Add(ApplianceNameOnly)
Loop
inputstream.Close()
End Sub
End Class