2011-02-07 10 views
0

私はVBバックエンドでasp.netの非常に簡単なショッピングカートを構築中ですが、私は自分のコードに問題があります。アプリケーションを実行してカートに商品を追加しようとすると、エラーメッセージが表示されます。ASP.NETショッピングカート

Object reference not set to an instance of an object. 

説明現在のWeb要求の実行中に、未処理の例外が発生しました。エラーの詳細とコード内のどこで発生したのかについては、スタックトレースを参照してください。

例外の詳細:System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません。

ソースエラー:

Line 27:   Dim blnMatch As Boolean = False 
Line 28: 
Line 29:   For Each Me.objDR In objDT.Rows 
Line 30:    If objDR("StockItemName") = Product Then 
Line 31:     objDR("Quantity") += txtQuantity.Text 

私はそれがこれをやっていると、おそらく誰かが見てみると、いくつかのアドバイスを提供できることを期待していた理由はわかりませんか?私は自分のコードをチェックしたが、何か間違ったものは見つけられないが、私はあなたがそれを持っている可能性があると考えている。

ここに私のコードです。

Shoppingcart.aspx

<asp:DropDownList id="ddlProducts" runat="server"> 

ソックスパンツ シャツハット
数量:






合計:

Shoppingcart.aspx.vb 輸入System.Data 部分公開クラスショッピングカート 継承System.Web.UI.Page

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 
'Mark Cart function 
Function makeCart() 
    objDT = CType(Session("Cart"), DataTable) 
    objDT.Columns.Add("StockID", GetType(Integer)) 
    objDT.Columns("StockID").AutoIncrement = True 
    objDT.Columns("StockID").AutoIncrementSeed = 1 

    objDT.Columns.Add("StockItemName", GetType(String)) 
    objDT.Columns.Add("StockItemValue", GetType(Decimal)) 
    Session("Cart") = objDT 
End Function 
'This is for adding items to the shopping cart. 
Sub AddToCart(ByVal s As Object, ByVal e As EventArgs) 
    objDT = Session("Cart") 
    Dim Product As String = ddlProducts.SelectedItem.Text 
    Dim blnMatch As Boolean = False 

    For Each Me.objDR In objDT.Rows 
     If objDR("StockItemName") = 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("StockItemName") = ddlProducts.SelectedItem.Text 
     objDR("StockItemValue") = Decimal.Parse(ddlProducts.SelectedItem.Value) 
     objDT.Rows.Add(objDR) 
     Session("Cart") = objDT 
    End If 

    dg.DataSource = objDT 
    dg.DataBind() 
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("StockItemValue") * 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 = "$" & GetItemTotal() 
End Sub 

エンドクラス

+0

は本当にNULLセッションでは、カートはありませんか? –

答えて

0

私はあなたのコードをコピーし、それを数回走らせて、それを真似しました。 インサイトページのセッション(「カート」)には何もありません。 DataTableに新しい列を追加するときにオブジェクト参照エラーが発生しました。

objDT = CType(Session("Cart"), DataTable) 

はそれを何の値が得られます。このようなあなたのセッションに等しいのDataTable(「カート」)を設定

。その代わり、initalページのロードで次の操作を行います。あなたが前に行ったよう

objDT = New Data.DataTable 

のセッション(「カート」)あなたが設定された後、(「カート」)セッションへのDataTable等しいを設定することができます。

全体の機能:

Function makeCart() 
    objDT = New Data.DataTable 
    objDT.Columns.Add("StockID", GetType(Integer)) 
    objDT.Columns("StockID").AutoIncrement = True 
    objDT.Columns("StockID").AutoIncrementSeed = 1 

    objDT.Columns.Add("StockItemName", GetType(String)) 
    objDT.Columns.Add("StockItemValue", GetType(Decimal)) 
    Session("Cart") = objDT 
End Function 
関連する問題