我靠,见鬼了,GridView获取DataKeys值的问题.
在page_load部分直接
Response.Write(gv_Info.DataKeys[0].Value.ToString()); ,这样可以得到这个gridview的0行DataKeys值
但是我把这一句放到一个button里居然就提示错误
索引超出范围。必须为非负值并小于集合大小。
参数名: index
行 54: {
行 55: Response.Write(gv_Info.DataKeys[0].Value.ToString());
行 56: }
行 57:
为什么会这样?
易做图,真的见鬼了.高人帮忙。
--------------------编程问答-------------------- 哦。。。。。。。。。。好久不写代码了
首先应该是超边界了 --------------------编程问答-------------------- 都说了,在pageload部分这句测试不会出错,而且可以正常获得的,但是放到button的click事件里执行就出错了 --------------------编程问答-------------------- 你什么时候加载gv_Info数据,如果在pageload,那么在加载前面加ispostback看看 --------------------编程问答-------------------- if(!IsPostBack)
加载数据代码 --------------------编程问答-------------------- 加了 --------------------编程问答-------------------- Response.Write(gv_Info.DataKeys[0].Value.ToString());
之前先判断一下gv_Info是否有数据 --------------------编程问答-------------------- protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
new BLL.MyControls().MyColDrop(drop_College);
new BLL.MyControls().MyHelpDrop(drop_Nj, "003");
new BLL.MyControls().MyClassXSHNJ(drop_Class, drop_College.SelectedValue, drop_Nj.SelectedValue);
this.Bind();
}
}
protected void drop_College_SelectedIndexChanged(object sender, EventArgs e)
{
new BLL.MyControls().MyClassXSHNJ(drop_Class, drop_College.SelectedValue, drop_Nj.SelectedValue);
this.Bind();
}
protected void drop_Nj_SelectedIndexChanged(object sender, EventArgs e)
{
new BLL.MyControls().MyClassXSHNJ(drop_Class, drop_College.SelectedValue, drop_Nj.SelectedValue);
this.Bind();
}
protected void drop_Class_SelectedIndexChanged(object sender, EventArgs e)
{
this.Bind();
}
private void Bind()
{
gv_Info.DataSource = new BLL.JJ_SubInfo().GetInfoList(drop_Class.SelectedValue, (string)Application["AdYear"], (string)Application["AdNum"]);
gv_Info.DataBind();
}
protected void btn_AllChoose_Click(object sender, EventArgs e)
{
new BLL.MyControls().MyCkbAllChoose(btn_AllChoose, gv_Info, "cb_Choose");
}
protected void btn_Del_Click(object sender, EventArgs e)
{
for(int i=0;i<gv_Info.Rows.Count;i++)
{
CheckBox ckb = (CheckBox)this.gv_Info.Rows[i].FindControl("cb_Choose");
if (ckb.Checked)
{
string strDelId = (string)gv_Info.DataKeys[i].Value;
new BLL.JJ_SubInfo().Delete(strDelId);
Response.Write("<script>alert('数据删除成功!');</script>");
}
}
this.Bind();
}
代码我给出来,bind是肯定有数据的,在批量删除的时候出现错误,button里的(string)gv_Info.DataKeys[i].Value;出错 --------------------编程问答-------------------- gv_Info.Rows.Count-1 --------------------编程问答-------------------- ......................-1干什么,这里获得的行是正确的。..跟这个完全没有关系.
我都说了,在pageload部分是正确的,在button的click里才会错。........... --------------------编程问答-------------------- 终于发现原因了,写在 .ascx里,并且动态加载的控件,忘记给赋值ID了。无语. --------------------编程问答-------------------- ID没值
补充:.NET技术 , ASP.NET