当前位置:编程学习 > C#/ASP.NET >>

帮忙看下这句 错在哪里啊……各位大大们!

“/”应用程序中的服务器错误。
--------------------------------------------------------------------------------

索引超出范围。必须为非负值并小于集合大小。
参数名: index 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 

异常详细信息: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。
参数名: index

源错误: 


行 51:         SqlCommand commnd2 = new SqlCommand(strsql2, connections);
行 52:         commnd.Parameters.Add(new SqlParameter("@userid", SqlDbType.VarChar, 50));
行 53:         commnd.Parameters["@userid"].Value = DataGrid1.DataKeys[(int)e.Item.ItemIndex];
行 54:         commnd2.Parameters.Add(new SqlParameter("@userid", SqlDbType.VarChar, 50));
行 55:         commnd2.Parameters["@userid"].Value = DataGrid1.DataKeys[(int)e.Item.ItemIndex];
 


--------------------编程问答-------------------- 异常详细信息: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。

......
貌似错误消息已经说得很清楚了吧.... --------------------编程问答-------------------- 你自己不会调试的吗? --------------------编程问答--------------------
提示够清楚了。。。

commnd.Parameters["@userid"].Value = DataGrid1.DataKeys[(int)e.Item.ItemIndex];


红色部分。。。这个得到出为个负数。。。肯定不对。。。

DataGrid1.DataKeys索引从0开始。。

断点一下。。看红色部分为什么没取到东西。。 --------------------编程问答-------------------- 关键是我不会调试啊…… 网上下的个源码  能帮忙说下怎么调试哇? --------------------编程问答-------------------- 代码贴全点,你是在什么事件里面写这些代码的?
还有datakey在绑定数据源的时候是否已经指定过 --------------------编程问答-------------------- F9下断点,执行,F10一步步执行看! --------------------编程问答-------------------- using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;

public partial class addteacher : System.Web.UI.Page
{
    SqlConnection connections;
    protected void Page_Load(object sender, EventArgs e)
    {
        //若用户未登录系统 
        if (Session["user_id"] == null)
        {
            //返回到登录页面 
            Response.Redirect("default.aspx");
        }
        //若用户身份不是管理员 
        if ((int)Session["user_lever"] != 1)
        {
            Response.Redirect("default.aspx");
        }
        this.Title = "添加新教师";
        string strconn = System.Configuration.ConfigurationManager.AppSettings["connstring"];
        connections = new SqlConnection(strconn);
       //connections.Open(); 
    }
    protected void ltbnAdd_Click(object sender, EventArgs e)
    {
        if (txtNo.Text == "" || txtName.Text == "")
        {
            Response.Write("<script language=javascript>alert('请填写所有数据!');</script>");
            return;
        }
        //调用存放的SQL Server中的添加教师存储过程“addtea” 
        SqlCommand commnd = new SqlCommand("addtea", connections);
        commnd.CommandType = CommandType.StoredProcedure;
        commnd.Parameters.Add(new SqlParameter("@tid", SqlDbType.VarChar, 50));
        commnd.Parameters["@tid"].Value = txtNo.Text;
        commnd.Parameters.Add(new SqlParameter("@tname", SqlDbType.VarChar, 50));
        commnd.Parameters["@tname"].Value = txtName.Text;
        commnd.Parameters.Add(new SqlParameter("@tcol", SqlDbType.VarChar, 50));
        commnd.Parameters["@tcol"].Value = dropCollege.SelectedItem.Text;
        commnd.Connection.Open();
        try
        {
            
            commnd.ExecuteNonQuery();
            Response.Write("<script language=javascript>alert('记录添加成功!');</script>");
            
        }
        catch (SqlException)
        {
            Response.Write("<script language=javascript>alert('记录添加失败, 请检查输入数据!');</script>");
        }
        commnd.Connection.Close();
    }
    protected void lbtnBack_Click(object sender, EventArgs e)
    {
        Response.Redirect("admin_teacher.aspx"); 
    }
    protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
    {
        SqlCommand commnd = new SqlCommand("select * from tabtea where Tid=@Tid", connections);
        commnd.Parameters.Add("@Tid", SqlDbType.VarChar, 50);
        commnd.Parameters["@Tid"].Value = txtNo.Text;
        SqlDataReader sdreader = commnd.ExecuteReader();
        if (sdreader.Read()) //若找到编号相同的记录 
        {
            CustomValidator1.IsValid = false;//验证失败 
        }
        else
        {
            CustomValidator1.IsValid = true; //验证成功 
        }
        connections.Close(); 
    }
}
--------------------编程问答-------------------- using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;

public partial class admin_teacher : System.Web.UI.Page
{
    SqlConnection connections;
    string strsql;
    protected void Bindgrid()
    {
        strsql = "select * from tabtea";
        SqlDataAdapter da = new SqlDataAdapter(strsql, connections);
        DataSet ds = new DataSet();
        da.Fill(ds);
        DataGrid1.DataSource = ds;
        DataGrid1.DataBind();
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        lbtnTeacher.Enabled = false;
        if (Session["user_id"] == null)
        {
            Response.Redirect("default.aspx");
        }
        this.Title = "教师管理";
        string conn = System.Configuration.ConfigurationManager.AppSettings["connstring"];
        connections = new SqlConnection(conn);
        if (!IsPostBack)
        {
            Bindgrid();
        }
    }
    public void DataGrid_delete(object sender, DataGridCommandEventArgs e)
    {
        int lastPageIndex = DataGrid1.CurrentPageIndex;
        string strsql = "delete from tabtea where Tid=@tid";
        string strsql2 = "delete from tabtea_cour where Tid=@tid";
        SqlCommand commnd = new SqlCommand(strsql, connections);
        SqlCommand commnd2 = new SqlCommand(strsql2, connections);
        commnd.Parameters.Add(new SqlParameter("@tid", SqlDbType.VarChar, 50));
        commnd.Parameters["@tid"].Value = DataGrid1.DataKeys[(int)e.Item.ItemIndex];
        commnd2.Parameters.Add(new SqlParameter("@tid", SqlDbType.VarChar, 50));
        commnd2.Parameters["@tid"].Value = DataGrid1.DataKeys[(int)e.Item.ItemIndex];
        commnd.Connection.Open();
        try
        {
            if (DataGrid1.PageCount - DataGrid1.CurrentPageIndex == 1 && DataGrid1.Items.Count == 1)
            {
                if (DataGrid1.PageCount > 1)
                {
                    lastPageIndex = lastPageIndex - 1;
                }
                else
                {
                    lastPageIndex = 0;
                }
            }
            DataGrid1.CurrentPageIndex = lastPageIndex;
            commnd2.ExecuteNonQuery();
            commnd.ExecuteNonQuery();
            Response.Write("<script language=javascript>alert('数据删除成功!');</script>");
        }
        catch (SqlException ex)
        {
            Response.Write("<script language=javascript>alert('数据删除失败!');</script>");
            Response.Write(ex.Message);
        }
        commnd.Connection.Close();
        commnd2.Connection.Close();
        Bindgrid();
    }
    public void DataGrid_update(object sender, DataGridCommandEventArgs e)
    {
        string strsql = "update tabtea set Tname=@tname,Tcol=@tcol where Tid=@tid";
        SqlCommand commnd = new SqlCommand(strsql, connections);
        commnd.Parameters.Add(new SqlParameter("@tname", SqlDbType.VarChar, 50));
        commnd.Parameters.Add(new SqlParameter("@tcol", SqlDbType.VarChar, 50));
        commnd.Parameters.Add(new SqlParameter("@tid", SqlDbType.VarChar, 50));
        string colvalue = ((TextBox)e.Item.Cells[3].Controls[0]).Text;
        commnd.Parameters["@tname"].Value = colvalue;
        colvalue = ((TextBox)e.Item.Cells[4].Controls[0]).Text;
        commnd.Parameters["@tcol"].Value = colvalue;
        commnd.Parameters["@tid"].Value = DataGrid1.DataKeys[(int)e.Item.ItemIndex];
        commnd.Connection.Open();
        try
        {
            commnd.ExecuteNonQuery();
            Response.Write("<script language=javascript>alert('数据修改成功!');</script>");
            DataGrid1.EditItemIndex = -1;
        }
        catch (SqlException)
        {
            Response.Write("<script language=javascript>alert('数据修改失败,请检查输入!');</script>");
        }
        commnd.Connection.Close();
        Bindgrid();
    }
    public void DataGrid_Page(object sender, DataGridPageChangedEventArgs e)
    {
        DataGrid1.CurrentPageIndex = e.NewPageIndex;
        Bindgrid();
    }
    public void DataGrid_cancel(object sender, DataGridCommandEventArgs e)
    {
        DataGrid1.EditItemIndex = -1;
        Bindgrid();
    }
    public void DataGrid_edit(object sender, DataGridCommandEventArgs e)
    {
        DataGrid1.EditItemIndex = (int)e.Item.ItemIndex;
        Bindgrid();
    }
    protected void btnSearch_Click(object sender, EventArgs e)
    {

        string sqlstring;
        DataGrid1.CurrentPageIndex = 0;
        if (DropType.Text == "编号")
        {
            sqlstring = "select * from tabtea where Tid='" + txtKeyword.Text + "'";
        }
        else
        {
            sqlstring = "select * from tabtea where Tname='" + txtKeyword.Text + "'";
        }
        SqlDataAdapter da = new SqlDataAdapter(sqlstring, connections);
        DataSet ds = new DataSet();
        da.Fill(ds);
        DataGrid1.DataSource = ds;
        DataGrid1.CurrentPageIndex = 0;
        DataGrid1.DataBind();
        if (DataGrid1.Items.Count == 0)
        {
            Response.Write("<script language=javascript>alert('查无此人,请检查输入!');</script>");
            return;
        }
    }
    protected void lbtnDisplayAll_Click(object sender, EventArgs e)
    {
        Bindgrid();
    }
    protected void lbtnAdd_Click(object sender, EventArgs e)
    {
        Response.Redirect("addteacher.aspx");
    }
    protected void lbtnQuit_Click(object sender, EventArgs e)
    {
        Session.Clear();
        Response.Redirect("default.aspx");
    }
    protected void lbtnCourse_Click(object sender, EventArgs e)
    {
        Response.Redirect("admin_course.aspx");
    }
    protected void lbtnStudent_Click(object sender, EventArgs e)
    {
        Response.Redirect("admin_stu.aspx");
    }
    protected void lbtnResult_Click(object sender, EventArgs e)
    {
        Response.Redirect("admin_grade.aspx");
    }
    protected void lbtnClass_Click(object sender, EventArgs e)
    {
        Response.Redirect("admin_class.aspx");
    }
    protected void lbtnSelect_Click(object sender, EventArgs e)
    {
        Response.Redirect("admin_choose.aspx");
    }
    protected void lbtnTeacher_Click(object sender, EventArgs e)
    {
        Response.Redirect("admin_teacher.aspx");
    }
}
--------------------编程问答--------------------
引用 1 楼 foren_whb 的回复:
异常详细信息: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。

......
貌似错误消息已经说得很清楚了吧....

描述的非常清楚了。。。加断点调试下
 DataGrid1.DataKeys[(int)e.Item.ItemIndex];明显e.Item.ItemIndex这个值 超出了DataGrid1.DataKeys集合的最大值
--------------------编程问答-------------------- 如何修改过啊?
堆栈跟踪:

[ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。
参数名: index]
   System.Collections.ArrayList.get_Item(Int32 index) +7486296
   System.Web.UI.WebControls.DataKeyCollection.get_Item(Int32 index) +12
   admin_stu.DataGrid_delete(Object sender, DataGridCommandEventArgs e) in g:\网站测试\jwgl\admin_stu.aspx.cs:53
   System.Web.UI.WebControls.DataGrid.OnDeleteCommand(DataGridCommandEventArgs e) +108
   System.Web.UI.WebControls.DataGrid.OnBubbleEvent(Object source, EventArgs e) +565
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
   System.Web.UI.WebControls.DataGridItem.OnBubbleEvent(Object source, EventArgs e) +123
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
   System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) +118
   System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument) +135
   System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +175
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565


--------------------编程问答-------------------- 断点,F11,单步调试 --------------------编程问答-------------------- F9 F11 --------------------编程问答-------------------- 大哥,就是你给下GRIDVIEW控件的datakeysName就好了,看看没有那个索引,就写那个字段 --------------------编程问答--------------------  前台数据绑定的时候,DataKey设置了什么? 代码贴出来
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,