说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。参数名: index源错误: 行 65:         Dim conn As System.Data.SqlClient.SqlConnection = New System.Data.SqlClient.SqlConnection(ConfigurationSettings.AppSettings("LawConnStr"))
行 66:         Dim number As String = CType(e.Item.FindControl("number"), TextBox).Text
行 67:         Dim strsql As String = "Update dingdan set num=" & number & " where " & DataList1.DataKeyField & "=" & DataList1.DataKeys(e.Item.ItemIndex)
行 68:         ExecuteSQL(strsql)
行 69:         DataList1.EditItemIndex = -1
 
源文件: E:\ww\hd\shopping\shoppingcart.aspx.vb    行: 67 堆栈跟踪: [ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。
参数名: index]
   System.Collections.ArrayList.get_Item(Int32 index) +91
   System.Web.UI.WebControls.DataKeyCollection.get_Item(Int32 index) +10
   hd.shoppingcart.DataList_UpdateCommand(Object sender, DataListCommandEventArgs e) in E:\ww\hd\shopping\shoppingcart.aspx.vb:67
   System.Web.UI.WebControls.DataList.OnUpdateCommand(DataListCommandEventArgs e) +109
   System.Web.UI.WebControls.DataList.OnBubbleEvent(Object source, EventArgs e) +294
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +26
   System.Web.UI.WebControls.DataListItem.OnBubbleEvent(Object source, EventArgs e) +101
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +26
   System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) +121
   System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +115
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +18
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +138
   System.Web.UI.Page.ProcessRequestMain() +1277 
这个怎么解决啊???

解决方案 »

  1.   

    检查一下e.Item.ItemIndex的值是什么
      

  2.   

    怎样检查e.Item.ItemIndex的值啊???????????
      

  3.   

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            If Not IsPostBack Then BindList()
        End Sub    Sub BindList()
            Dim conn As System.Data.SqlClient.SqlConnection = New System.Data.SqlClient.SqlConnection(ConfigurationSettings.AppSettings("LawConnStr"))
            Try
                Dim rd As System.Data.SqlClient.SqlDataAdapter
                Dim ds As DataSet
                Dim dv As DataView
                Dim sql As String
                conn.Open()
                sql = "SELECT id,lei3,pro,vprice,num,money FROM dingdan"
                rd = New System.Data.SqlClient.SqlDataAdapter(sql, conn)
                ds = New DataSet
                rd.Fill(ds, "dingdan")
                dv = ds.Tables("dingdan").DefaultView
                DataList1.DataSource = dv
                DataList1.DataBind()
            Catch es As Exception
                Response.Write("<script language=javascript>" & Chr(13) & "alert('" & es.Message & "'); " & " </script>")
            Finally
                conn.Close()
            End Try
        End Sub    Sub DataList_UpdateCommand(ByVal sender As Object, ByVal e As DataListCommandEventArgs)
            Dim conn As System.Data.SqlClient.SqlConnection = New System.Data.SqlClient.SqlConnection(ConfigurationSettings.AppSettings("LawConnStr"))
            Dim number As String = CType(e.Item.FindControl("number"), TextBox).Text
            Dim strsql As String = "Update dingdan Set num='" & number & "' where '" & DataList1.DataKeyField & "'=' & DataList1.DataKeys(e.Item.ItemIndex) '"
            ExecuteSQL(strsql)
            DataList1.EditItemIndex = -1
            BindList()
        End Sub    Sub ExecuteSQL(ByVal strsql As String)
            Dim conn As System.Data.SqlClient.SqlConnection = New System.Data.SqlClient.SqlConnection(ConfigurationSettings.AppSettings("LawConnStr"))
            Dim sqlSQL As String
            Dim Cmd As New System.Data.SqlClient.SqlCommand(sqlSQL, conn)
            conn.Open()
            Cmd.CommandText = strsql
            Cmd.ExecuteNonQuery()
        End Sub部分代码如上,为什么会出错啊,可以帮我看看是不是代码写错了吗?
      

  4.   

    对,用逐步调试的方法,看看e.item.itemindex的值
      

  5.   

    DataList1.EditItemIndex = -1
    这一行是什么意思?能给他赋值为-1吗?
      

  6.   

    DataList1.EditItemIndex = -1
    就是不对DataList1进行编辑操作
      

  7.   

    Dim strsql As String = "Update dingdan Set num='" & number & "' where '" & DataList1.DataKeyField & "'=' & DataList1.DataKeys(e.Item.ItemIndex) '"断点调试时,执行到上面这一行就跳出了,所以还不知道e.Item.ItemIndex的值,异常详细信息: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。参数名: index应该怎么改啊????????
      

  8.   

    知道了,断点调试,
    操作第一行时e.Item.ItemIndex是0
    操作第二行时e.Item.ItemIndex是1可是为什么还是出错啊,异常详细信息: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。参数名: index
      

  9.   

    Dim strsql As String = "Update dingdan Set num='" & number & "' where '" & DataList1.DataKeyField & "'=' & DataList1.DataKeys(e.Item.ItemIndex) '"
    ------------------
    首先,你这样写很不好,代码较乱,不清晰.改如下
    dim myKeyid as string = DataList1.DataKeys(e.Item.ItemIndex).ToString()
    dim strsql as string = "Update dingdan Set num = '" & number & "' where 主键ID名 = '" + myKeyid + "' "
    其次,你上面的写法有错误,& DataList1.DataKeys(e.Item.ItemIndex) '",后面少了个&"号,前面少了个"号.
    再次,你为什么要用DataList1.DataKeyField 这样来取主键名称呢?这样容易出问题
    最后,你想用DataKeys的方式来取主键,那么你在绑定的时候,有没有设定主键?如果没有,则取的时候就出问题了.另外,你可用如下方法测试当前的索引号(此处为C#)
    try
    {
    dim myKeyid as string = DataList1.DataKeys(e.Item.ItemIndex).ToString()
    }
    catch
    {
    response.write (e.Item.ItemIndex)
    response.end()
    }
      

  10.   

    "Update dingdan Set num='" 

    number 

    "' where '" 
    &
     DataList1.DataKeyField 
    &
     "'=' 
    &
     DataList1.DataKeys(e.Item.ItemIndex) '"看出问题了吧????        我把你的语句拆开了。你引号没用对
      

  11.   

    Update dingdan Set num='1' where 'aaa'='&DataList1.DataKeys(e.Item.ItemIndex) '如果执行的话字符串可能的值是这个,你的整个表达式被当作字符串了。应把
    Dim strsql As String = "Update dingdan Set num='" & number & "' where '" & DataList1.DataKeyField & "'=' & DataList1.DataKeys(e.Item.ItemIndex) '"后面(从第3个=开始)改为:
    ='"&DataList1.DataKeys(e.Item.ItemIndex)&"'"
      

  12.   

    谢谢   hchxxzx(NET?摸到一点门槛):怎么还是这样啊?异常详细信息: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。参数名: index
     Dim myKeyid As String = DataList1.DataKeys(e.Item.ItemIndex).ToString()
      

  13.   

    谢谢  syeerzy(快乐永远): 我都改过来了,可是为什么还是这样啊,还有别的原因吗???