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

或者您可以将其合并为一个步骤:

 Dim array_list = new ArrayList()

之后,您可以使用从数组列表中添加和删除元素

 array_list.add(obj)

并删除

 array_list.remove(obj)

看起来您的问题与访问数组列表的成员有关。新项目总是添加到数组列表的末尾。要直接访问它们,您将需要它们的索引。如果您知道要访问的项目的索引,请使用

 array_list(i)

如果不这样做,则需要遍历数组。为此,您有两个选择。您可以使用“for each”,也可以使用普通的 for 循环并使用 array_list.count 作为上限。

每次调用按钮单击菜单时,您都在重新创建两个会话值。您需要将它们从 Session 变量中拉出,并将它们放入局部变量中,然后将它们放回会话变量中。

你的按钮方法应该是:

 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。

网络表单编辑:

您可能应该检查初始化arrayList 的位置。就像在 Page_Load 中一样:

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

MSDN 回传

于 2013-02-28T20:56:46.300 回答