首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

帮小弟我看个小异常!都来都来,立即给分!

2012-02-01 
帮我看个小错误!都来都来,立即给分!!索引超出范围。必须为非负值并小于集合大小。参数名:index说明:执行当前

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

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

源错误:  


行   170:                         if   (chk.Checked)
行   171:                         {
行   172:                                 ID[i]   =   Convert.ToInt32(list1.DataKeys[dl.ItemIndex+1].ToString());
行   173:                                 try
行   174:                                 {
 


我的代码如下:
protected   void   ImageButton1_Click(object   sender,   ImageClickEventArgs   e)
        {
                int[]   ID   =   new   int[list1.Items.Count];
                int   i   =   0;

                foreach   (DataListItem   dl   in   list1.Items)
                {
                        CheckBox   chk   =   (CheckBox)dl.FindControl( "chkSelect ");
                        if   (chk.Checked)
                        {
                                ID[i]   =   Convert.ToInt32(list1.DataKeys[dl.ItemIndex].ToString());
                                try
                                {
                                        conn   =   new   SqlConnection(System.Configuration.ConfigurationSettings.AppSettings[ "ConnStr "]);
                                        conn.Open();
                                        cmd   =   new   SqlCommand( "delete   from   zhanquxinxi   where   zh=ID[i] ",   conn);
                                        cmd.ExecuteNonQuery();
     
                                }
                                catch   (Exception   exp)
                                {


                                        Response.Write(exp.Message);
                                }
                        }
                }
                BindData1();
        }

[解决办法]
在删除时没有考滤到最后设置
[解决办法]
uP
[解决办法]
估计是参数问题..你最好吧那一段的数据打印出来 看看...
[解决办法]
i的值是不是要++
[解决办法]
DataKeys[dl.ItemIndex+1] 这个索引超出范围了。。你不要用+1试下,索引是从0开始的
[解决办法]
DataKeys[dl.ItemIndex+1] 这个索引超出范围了。。你不要用+1试下,索引是从0开始的
////
这个说的是一种情况

还有看你的DataLIst的DataKeyField是否设值了
[解决办法]
应该是DataKeys问题把?
[解决办法]
你可以在模板列在添加一个标签控件隐藏 把id赋给他 当chk.Checked取值
CheckBox chk = (CheckBox)dl.FindControl( "chkSelect ");
if (chk.Checked)
{
ID[i] = (Label)GridView2.Rows[i].FindControl( "Label1 ").Text;
try
{
conn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings[ "ConnStr "]);
conn.Open();
cmd = new SqlCommand( "delete from zhanquxinxi where zh=ID[i] ", conn);
cmd.ExecuteNonQuery();

}
catch (Exception exp)
{
Response.Write(exp.Message);
}
}

[解决办法]
up!
[解决办法]
ID[i] = Convert.ToInt32(list1.DataKeys[dl.ItemIndex].ToString());
====================
这样也超出范围的话那就是你根本就每设置DataLIst的DataKeyField,连这个属性都每设置,你怎么可以用DataKeys[i]来取值呢?

看楼主的代码应该把DataLIst的DataKeyField设为你的那个数据库表的主键ID,然后菜可以用DataKeys[i]来取第i行的ID值
[解决办法]
if (chk.Checked)
行 171: {
行 172: ID[i] = Convert.ToInt32(list1.DataKeys[dl.ItemIndex+1].ToString());
行 173: try
行 174: {
你这个i并没有变,总是0
[解决办法]
cmd = new SqlCommand( "delete from zhanquxinxi where zh=ID[i] ", conn);

这是什么SQL语句?
[解决办法]
????

[解决办法]
delete from zhanquxinxi where zh=ID[i]
错了。
ID[i] = Convert.ToInt32(list1.DataKeys[dl.ItemIndex+1].ToString());
把这句分成2句,看看哪个索引超出范围。
------解决方案--------------------


在Datalist页面代码中,添加DataKeyField= "你的id " 你的id:一般都是你数据库的主键!

热点排行