查看: 967|回复: 6
|
我写的简单shopping cart...(ASP.net)
[复制链接]
|
|
以下是我写的简单shopping cart.. 但不知为何,红highlight那行test run时
出现error..
Object reference not set to an instance of an object.
------------------------------------------------------------------------
<%
Dim objDT As System.Data.DataTable
Dim objDR As System.Data.DataRow
Private Sub Page_Load(ByVal s As Object, ByVal e As EventArgs)
If Not IsPostBack Then
makeCart()
End If
End Sub
Function makeCart()
objDT = New System.Data.DataTable("Cart")
objDT.Columns.Add("ID", GetType(Integer))
objDT.Columns("ID").AutoIncrement = True
objDT.Columns("ID").AutoIncrementSeed = 1
objDT.Columns.Add("Quantity", GetType(Integer))
objDT.Columns.Add("Product", GetType(String))
objDT.Columns.Add("Cost", GetType(Decimal))
Session("Cart") = objDT
End Function
Sub AddToCart(ByVal s As Object, ByVal e As EventArgs)
objDT = Session("Cart")
Dim Product = ddlProducts.SelectedItem.Text
Dim blnMatch As Boolean = False
For Each objDR In objDT.Rows
If objDR("Product") = Product Then
objDR("Quantity") += txtQuantity.Text
blnMatch = True
Exit For
End If
Next
If Not blnMatch Then
objDR = objDT.NewRow
objDR("Quantity") = txtQuantity.Text
objDR("Product") = ddlProducts.SelectedItem.Text
objDR("Cost") = Decimal.Parse(ddlProducts.SelectedItem.Value)
objDT.Rows.Add(objDR)
End If
Session("Cart") = objDT
dg.DataSource = objDT
dg.DataBind()
lblTotal.Text = "RM" & GetItemTotal()
End Sub
Function GetItemTotal() As Decimal
Dim intCounter As Integer
Dim decRunningTotal As Decimal
For intCounter = 0 To objDT.Rows.Count - 1
objDR = objDT.Rows(intCounter)
decRunningTotal += (objDR("Cost") * objDR("Quantity"))
Next
Return decRunningTotal
End Function
Sub Delete_Item(ByVal s As Object, ByVal e As DataGridCommandEventArgs)
objDT = Session("Cart")
objDT.Rows(e.Item.ItemIndex).Delete()
Session("Cart") = objDT
dg.DataSource = objDT
dg.DataBind()
lblTotal.Text = "RM" & GetItemTotal()
End Sub
%> |
|
|
|
|
|
|
|
发表于 26-11-2006 11:19 PM
|
显示全部楼层
问题在于你的 objDT 是空的.
如果我没猜错, 你应该是在按了某些 button 后就呼叫 AddToCart. 问题是每呼叫一次你的 page 就 postback 一次, 而你却在 page 第一次 load 的时候才建立 objDT, 而不是在每一次 postback, 所以自然是空的.
给你一个建议, 用 ViewState 可以解决你的问题.  |
|
|
|
|
|
|
|

楼主 |
发表于 26-11-2006 11:33 PM
|
显示全部楼层
你说的没错, 我是按了一个button才呼叫AddToCart
而你刚才说我的page 只在第一次 load 的时候才建立 objDT, 而不是在每一次 postback, 所以自然是空的.
但我已经加了这行 Session("Cart") = objDT 在makecart啊
[ 本帖最后由 counterking 于 26-11-2006 11:35 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 26-11-2006 11:59 PM
|
显示全部楼层
好吧... 看走眼了.
问题出在这里:
objDT = Session("Cart")
Session 存入的是 Object, 任何一个 Object, 问题在于, 呼叫的时候, Session 懂的传回怎么样的 Object 吗? :) |
|
|
|
|
|
|
|
发表于 27-11-2006 03:01 AM
|
显示全部楼层
原帖由 counterking 于 26-11-2006 10:56 PM 发表
<%
Dim objDT As System.Data.DataTable
Dim objDR As System.Data.DataRow
Private Sub Page_Load(ByVal s As Object, ByVal e As EventArgs)
If Not IsPostBack Then
makeCart()
End If
End Sub
Function makeCart()
objDT = New System.Data.DataTable("Cart")
objDT.Columns.Add("ID", GetType(Integer))
objDT.Columns("ID").AutoIncrement = True
objDT.Columns("ID").AutoIncrementSeed = 1
objDT.Columns.Add("Quantity", GetType(Integer))
objDT.Columns.Add("Product", GetType(String))
objDT.Columns.Add("Cost", GetType(Decimal))
Session("Cart") = objDT
End Function
Sub AddToCart(ByVal s As Object, ByVal e As EventArgs)
objDT = Session("Cart")
Dim Product = ddlProducts.SelectedItem.Text
Dim blnMatch As Boolean = False
For Each objDR In objDT.Rows
If objDR("Product") = Product Then
objDR("Quantity") += txtQuantity.Text
blnMatch = True
Exit For
End If
Next
If Not blnMatch Then
objDR = objDT.NewRow
objDR("Quantity") = txtQuantity.Text
objDR("Product") = ddlProducts.SelectedItem.Text
objDR("Cost") = Decimal.Parse(ddlProducts.SelectedItem.Value)
objDT.Rows.Add(objDR)
End If
Session("Cart") = objDT
dg.DataSource = objDT
dg.DataBind()
lblTotal.Text = "RM" & GetItemTotal()
End Sub
Function GetItemTotal() As Decimal
Dim intCounter As Integer
Dim decRunningTotal As Decimal
For intCounter = 0 To objDT.Rows.Count - 1
objDR = objDT.Rows(intCounter)
decRunningTotal += (objDR("Cost") * objDR("Quantity"))
Next
Return decRunningTotal
End Function
Sub Delete_Item(ByVal s As Object, ByVal e As DataGridCommandEventArgs)
objDT = Session("Cart")
objDT.Rows(e.Item.ItemIndex).Delete()
Session("Cart") = objDT
dg.DataSource = objDT
dg.DataBind()
lblTotal.Text = "RM" & GetItemTotal()
End Sub
%>
会不会是quantity 的问题?DT 是declare as integer, 然后加的时候 是和 string 加在一起。。试下换换看。。
你的做法顺序都和我之前做的很像,连variable 也很象。。所以我才应该是Refer 同一个sample 的。。:P:P
不行的话连objDR["qty"] 也convert 成integer 咯。。
我的是C#的。。
objDR["Adult_QTY"] = int.Parse(objDR["Adult_QTY"].ToString()) + int.Parse(txtAdultQTY.Text);
我之前这行也是有问题。。。
objDR["Adult_QTY"] += int.parse(txtAdultQTY.Text) 的话。。会有error .. 应该是consider object 不能和integer 加在一起。。
不知道你也是不是类似的问题。。希望能帮到你。。:$
[ 本帖最后由 zuying1985 于 27-11-2006 03:04 AM 编辑 ] |
|
|
|
|
|
|
|
发表于 30-11-2006 09:30 PM
|
显示全部楼层
你们都很pro..我现在的assignment也要做类似的trading page...不大懂,因为是初学者。。。 |
|
|
|
|
|
|
|
发表于 3-12-2006 08:00 PM
|
显示全部楼层
请问大大怎样加入messagerbox/errordialog box?
C# 的!! |
|
|
|
|
|
|
| |
本周最热论坛帖子
|