在我开始之前,我知道这不是最有效的方式来实现这个项目,而是为了学校。
项目是一个应该通过计算物品数量和每件物品价格来计算客户欠款的项目。所以说有两个项目,每个2.50。总应付金额现在为5,接下来有一项是3.00,现在总金额为8。
通过声明变量,可能使用函数,结构或类,这通常很容易。
我遇到麻烦的是这个项目需要使用一个结构数组(所以使用数组和结构覆盖)以及一个类。
当我和我的讲师交谈时,他给了我一个如何在另一个场景中使用数组的例子,基本上没有任何内容启动数组,并允许程序循环检查UPC。我使用了这个想法,并为产品名称添加了一个文本框,如果它匹配(假设添加了第三个项目并且与第一项相同)那么它只是将数量添加到数组中的现有条目。从理论上讲,总和应该是同样容易的,因为它只能计算数量和价格并将其加到总数中。
我没有编码按钮来清除所有变量“新订单”,因为这很容易。
我也让自己彻底迷茫,我觉得由于程序的复杂性不必要来完成这么简单的任务,但这就是我的主程序:
Public Class FrmMain
Dim order(-1) As product
Public totalDue As Decimal
Structure product
Public Quantity As Long
Public Price As Decimal
Public productName As String
End Structure
Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
Me.Close()
End Sub
Private Sub btnAdd_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAdd.Click
' adds the total price to the amount the customer owes
Dim book As New BookSale
Dim Quantity As Long
Dim Price As Decimal
Long.TryParse(txtQuantity.Text, Quantity)
Decimal.TryParse(txtPrice.Text, Price)
'when a user adds an item by id (could be UPC)...... This could be a click event
'boolean to declare if item was found
Dim bolFound As Boolean = False
'upc number of product
Dim strProduct As String = txtProduct.Text
'loop through array to see if product has already been added, if so, just update quantity
For i As Integer = 0 To order.Length - 1
If order(i).productName = strProduct Then
Quantity += numQuantity.value
bolFound = True
Exit For
End If
Next i
'if product was not found, add it to the array
If bolFound = False Then
'never found, add the new item
ReDim Preserve order(order.Length)
With order(order.Length - 1)
ProductName = txtProduct.Text
Price = numPrice.value
Quantity = numQuantity.value
End With
End If
totalDue = book.TotalDueTotal
lblTotalDue.Text = totalDue.ToString("N0")
End Sub
End Class
然后这是“bookSale”课程
Public Class BookSale
Private _Quantity As Integer
Private _Price As Decimal
Public Property TotalDue As Integer
Get
Return _Quantity
End Get
Set(ByVal value As Integer)
If value > 0 Then
_Quantity = value
Else
_Quantity = 0
End If
End Set
End Property
Public Property Price As Decimal
Get
Return _Price
End Get
Set(ByVal value As Decimal)
If value > 0 Then
_Price = value
Else
_Price = 0
End If
End Set
End Property
Public Sub New()
' default constructor
_Quantity = 0
_Price = 0
End Sub
Public Function TotalDueCalc() As Decimal
Return _Price * _Quantity
End Function
Public Function TotalDueTotal() As Decimal
Dim FinalTotal As Decimal
Return FinalTotal + TotalDueCalc()
End Function
End Class
到目前为止收到的错误是 错误3'numPrice'未声明。由于其保护级别,它可能无法访问。 错误1'numQuantity'未声明。由于其保护级别,它可能无法访问。 错误4'numQuantity'未声明。由于其保护级别,它可能无法访问。 错误2属性'ProductName'是'ReadOnly'。
非常感谢任何帮助。
P.S。我知道有些事情可能会丢失,比如将变量传递给班级,但我已经玩了大约3个小时,试图让它做我想做的事情,我只是把自己弄得太过分了。 同样是的,我是一个相对初学者的编程水平,这是我的第一个真正的编程类,教师说我们应该学习如何在类的第二部分处理VB的更高级方面做得更好。
再次感谢!
答案 0 :(得分:1)
有几点需要注意,没有特别的顺序。
您的With
语句需要在结构成员之前加.
,如.Quantity
,而不是数量。
您列出的四个错误是由于两个原因 - 代码中不存在numQuantity
和numPrice
- 您可能正在寻找Quantity
和{ {1}},Price
来电的结果。第四个错误是因为结构定义中有TryParse
,而不是productName
(请注意小写与大写首字母。
为避免混淆,我们将您的ProductName
和Quantity
变量名称(您在Price
来电中使用的名称)更改为TryParse
和{{ 1}}或类似内容,以避免与结构中的NewQuantity
和NewPrice
成员混淆Quantity
还有其他许多项目,我会采用不同的方式,但由于您正在学习该语言,因此您的教师很可能尚未向您介绍这些语言。这是您当前代码的修改版本,可以修复您列出的错误:
首先,在结构定义中将Price
的大小写更改为Product.
:
productName
其次,为ProductName
调用的结果使用不同的变量名称:
Structure product
Public Quantity As Long
Public Price As Decimal
Public ProductName As String
End Structure
第三,在更新现有订单的循环中,您需要在数组中引用正确的TryParse
。即使您的值为Dim newQuantity As Long
Dim newPrice As Decimal
Long.TryParse(txtQuantity.Text, newQuantity)
Decimal.TryParse(txtPrice.Text, newPrice)
,也无法更新该产品的数量 - 您需要告知程序更新Product
的数量:
Quantity.value
第四,在创建新产品时使用order(i)
表示法以及上面步骤2中的变量名称:
For i As Integer = 0 To order.Length - 1
If order(i).ProductName = strProduct Then
order(i).Quantity += newQuantity
bolFound = True
Exit For
End If
Next i
答案 1 :(得分:0)
List(Of Product)
不是使用数组,而是更好的选择,我也会将其设为class
而不是structure
。这里没有Redim
,只有.Add(New Product)
。您的阵列问题设置为-1
,并且在添加新元素之前不增加大小 - List
将简化此过程。至于你的numQuantity
,它根本就不存在,编译器只是让你知道。