佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 967|回复: 6

我写的简单shopping cart...(ASP.net)

[复制链接]
发表于 26-11-2006 10:56 PM | 显示全部楼层 |阅读模式
以下是我写的简单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
%>
回复

使用道具 举报


ADVERTISEMENT

发表于 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...不大懂,因为是初学者。。。
回复

使用道具 举报

Follow Us
发表于 3-12-2006 08:00 PM | 显示全部楼层
请问大大怎样加入messagerbox/errordialog box?
C# 的!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 26-8-2025 05:22 AM , Processed in 0.114832 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表