VB.NET主窗体类列表配合tag属性使用及订单计算异常如何解决
问题成因及解决方案
1. 「Conversion from string "" to type 'Double' is not valid」报错
- 成因:直接读取为空的数量文本框字符串参与数学运算,VB无法自动将空字符串转换为数值类型
- 解决方案:运算前先对文本框值做非空校验和安全转换,先写一个通用转换方法:
' 安全转换文本框数值,避免空值/非法输入报错 Private Function GetSafeQuantity(txt As TextBox) As Double Dim qty As Double = 0 Double.TryParse(txt.Text, qty) Return If(qty < 0, 0, qty) ' 额外校验防止输入负数 End Function
创建menu时调用该方法取值:
New MenuItem With {.Name = "Burger", .Cost = 2.0 * GetSafeQuantity(txtburger)}
2. menu移到窗体级后报「Object reference not set to an instance of an object」报错
- 成因:窗体级变量的初始化时机早于窗体控件的创建时机,此时访问
txtburger.Text等控件属性会触发空引用 - 解决方案:不要在窗体级声明时直接初始化menu,改为在窗体
Load事件中初始化,同时将订单对象也设为窗体级,避免每次事件新建订单丢失已选菜品:
' 窗体级变量声明 Dim menu As List(Of MenuItem) Dim order1 As Order Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' 窗体加载完成、控件全部创建后再初始化menu menu = New List(Of MenuItem) From { New MenuItem With {.Name = "Burger", .Cost = 2.0 * GetSafeQuantity(txtburger)}, New MenuItem With {.Name = "wrap", .Cost = 2.0 * GetSafeQuantity(txtwrap)}, New MenuItem With {.Name = "Parmesan", .Cost = 2.5 * GetSafeQuantity(txtparmesan)} } order1 = New Order() ' 初始化全局订单对象 End Sub
3. 复选框事件逻辑错误
- 成因:你处理的是
CheckBox.CheckedChanged事件,却将sender强制转换为Button,类型不匹配;且每次触发事件都新建order对象,之前选中的菜品会全部丢失 - 解决方案:修改事件逻辑如下:
Private Sub CheckBoxCheckedChangedHandler(sender As Object, e As EventArgs) Handles ckburger.CheckedChanged, ckwrap.CheckedChanged, ckparmesan.CheckedChanged Dim currentCk As CheckBox = CType(sender, CheckBox) If currentCk.Checked Then ' 匹配选中菜品 Dim menuItem As MenuItem = menu.Find(Function(item) item.Name = currentCk.Tag.ToString()) ' 更新为当前文本框输入的最新数量对应的价格 Dim pricePerUnit As Double = If(menuItem.Name = "Parmesan", 2.5, 2.0) Dim quantityTxt As TextBox = CType(Controls.Find("txt" & menuItem.Name.ToLower(), True)(0), TextBox) menuItem.Cost = pricePerUnit * GetSafeQuantity(quantityTxt) ' 加入全局订单 order1.AddItem(menuItem) ' 直接给总金额文本框赋值 txttotal.Text = order1.GetOrderTotal().ToString("F2") End If End Sub
4. 总金额无法正常显示问题
- 成因:原
OrderTotal方法的参数是默认值传递,方法内修改total不会同步到外部的文本框;同时循环集合名拼写错误(代码中交替写Item和Items) - 解决方案:修改Order类代码,将计算总金额的逻辑改为带返回值的方法:
Public Class Order Private Items As New List(Of MenuItem) Public Sub AddItem(ByVal item As MenuItem) Items.Add(item) End Sub ' 直接返回计算好的总金额 Public Function GetOrderTotal() As Decimal Dim fullamount As Decimal = 0 For Each item As MenuItem In Items fullamount += item.Cost Next Return fullamount End Function End Class
内容的提问来源于stack exchange,提问作者Hamza Asim
相关产品推荐
相关产品推荐

