1

arraylist にアイテムを追加する関数があります。私の問題は、ボタンをクリックするたびに点灯している配列を再初期化しているため、一度に1つのアイテムしか保持できないことです。まだ作成されていない場合にのみ配列を初期化する VB の構文は何ですか?

 Dim itemSelectAs New ArrayList()
 Dim Quantities As New ArrayList()
 Dim itemQtyOrdered As Integer

Public Sub ShtickDataList_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.ListViewCommandEventArgs) Handles ShtickDataList.ItemCommand


    If e.CommandName = "addToCart" Then
        Dim itemQuantity As DropDownList = e.Item.FindControl("QuantityDropDown")
        itemQtyOrdered = itemQuantity.SelectedValue
        ItemSelect.Add(e.CommandArgument)
        Quantities.Add(itemQtyOrdered)

        Session("itemInCart") = ItemSelect
        Session("quantities") = Quantities


        viewInvoice()

    End If


End Sub

Protected Sub viewInvoice()

    Dim itemSelected As ArrayList = DirectCast(Session("itemInCart"), ArrayList)
    Dim QuantityofItem As ArrayList = DirectCast(Session("quantities"), ArrayList)

    Dim conn As SqlConnection
    Dim comm As SqlCommand
    Dim reader As SqlDataReader
    Dim purimConnection2 As String = ConfigurationManager.ConnectionStrings("Purim").ConnectionString
    conn = New SqlConnection(purimConnection2)

    comm = New SqlCommand("SELECT ProductName FROM Products WHERE ProductID = @ProductID", conn)

    Dim i As Integer
    For i = 0 To ItemSelect.Count - 1
    comm.Parameters.Add("@ProductID", Data.SqlDbType.Int)
    comm.Parameters("@ProductID").Value = (ItemSelected.Count - 1)

    'Next

    Try
        conn.Open()
        reader = comm.ExecuteReader()
        ViewCartlink.Text = "View Cart: (" & ItemSelected.Count & ")"



    Finally
        conn.Close()
    End Try
End Sub
4

2 に答える 2

3

最初に、配列リストの次元を設定する必要があります。

 Dim array_list as ArrayList()

次に、インスタンス化できます

 array_list = new ArrayList

または、1 つのステップに組み合わせることができます。

 Dim array_list = new ArrayList()

その後、配列リストから要素を追加および削除できます

 array_list.add(obj)

で削除します

 array_list.remove(obj)

あなたの問題は、配列リストのメンバーへのアクセスに関連しているようです。新しい項目は常に配列リストの最後に追加されます。それらに直接アクセスするには、それらのインデックスが必要です。アクセスしたいアイテムのインデックスがわかっている場合は、使用します

 array_list(i)

そうでない場合は、配列を反復処理する必要があります。これを行うには、2 つのオプションがあります。「for each」を使用するか、通常の for ループを使用して、array_list.count を上限として使用できます。

ボタンクリックメニューを呼び出すたびに、2 つのセッション値を再作成しています。それらをセッション変数から引き出してローカル変数に入れ、セッション変数に戻す必要があります。

ボタンの方法は次のとおりです。

 Public Sub ShtickDataList_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.ListViewCommandEventArgs) Handles ShtickDataList.ItemCommand


   if isNothing(itemSelect) Then itemSelect = New ArrayList()
   if isNothing(itemQtyOrdered) Then itemQtyOrdered= New ArrayList()

   If e.CommandName = "addToCart" Then


       Dim itemQuantity As DropDownList = e.Item.FindControl("QuantityDropDown")
       itemQtyOrdered = itemQuantity.SelectedValue
       ItemSelect.Add(e.CommandArgument)
       Quantities.Add(itemQtyOrdered)

       Session("itemInCart") = ItemSelect
       Session("quantities") = Quantities


       viewInvoice()

   End If


 End Sub

グローバル呼び出しを次のように変更します。

 Dim itemSelect As ArrayList() = Session("itemInCart")
 Dim Quantities As New ArrayList() = Session("quantities")
于 2013-02-28T20:54:42.410 に答える
2

ボタン クリック イベントの外側で配列を定義します。(フォームレベル)

次に、ボタンクリックイベントでこれを試してください:

If myArrayList Is Nothing then
   'initializes the array list only if that hasn't happened yet
   myArrayList = new ArrayList
End If
'adds the item to the existing list without causing it to reintialize
myArrayList.add(item)

そうすれば、まだ初期化されていない場合は初期化されますが、既に初期化されている場合は初期化されません。フォーム レベルで初期化されている場合、つまり、すでに新規として宣言されている場合は、追加するだけです。

基本的に、ボタン クリック イベントで arrayList に対して New を呼び出していないことを確認してください。

Web フォームの編集:

おそらく、arrayList を初期化する場所を確認する必要があります。Page_Load のように:

If Not Page.IsPostBack Then
  myArrayList = New ArrayList
End If

MSDN ポストバック

于 2013-02-28T20:56:46.300 に答える