gridview从第二页跳转回第一页,获得主键函数报错

xiongao900112 2012-05-15 06:56:04
gridview从第二页跳转回第一页,提示获得主键函数出错,提示数组越界。



页面报错为:

索引超出范围。必须为非负值并小于集合大小。
参数名: index

源错误:


行 79: //通过CommandArgument获得行号,通过DataKeys获得当前行主键
行 80: //car_id = (int)GridView1.DataKeys[Convert.ToInt32(e.CommandArgument)].Value;
行 81: car_id = Convert.ToInt32(GridView1.Rows[Convert.ToInt32(e.CommandArgument)].Cells[0].Text);
行 82: if (e.CommandName == "申请")
行 83: {

第八十行调用获得主键,后来注释了第八十行。换成在gridview中把主键直接显示在cell[0],并通过e.CommandArgument得到行号。2种方法效果都一样。

错误提示是指向 car_id 这个值。 car_id 是得到gridview那一行的主键值,在出错时已经得到主键值了。


提问:为什么我能正常从第一页翻页到第二页,为什么从第二页翻页到第一页会报错,我在进行翻页操作的时候并没有调用这个获取主键的方法。

GridView1_PageIndexChanging 和 GridView1_PageIndexChanged 都是正常的。


附上这个页面的.cs代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Entity;
using BLL;

namespace 车辆管理系统页面.User.files
{
public partial class WebForm1 : System.Web.UI.Page
{
public static int car_id;
public static string sys_name;
public static string staticcartype;
public static string staticcarcode;

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//为2个静态变量赋值,是为了初始化未选择条件,gridview翻页时传值用
staticcartype = " ";
staticcarcode = " ";
if (Session["UserName"] != null)
{
username.Text = Session["UserName"].ToString();
sys_name = Session["UserName"].ToString();
}
else
{
Response.Redirect("ReturnMain.htm");
}
//使用格式化绑定数据源,若为0行结果,添加一行提示
BLL.DataTableBL.GridViewDataBind(GridView1, BLL.CarBL.carInfoByTypeBind_bypara_available(staticcarcode, staticcarcode));
//ispostback时重构GridView
BLL.DataTableBL.ResetGridView(GridView1);

字段选择.DataSource = BLL.CarTypeBL.CarTypeBind();
字段选择.DataTextField = "car_type_detail";
字段选择.DataBind();
字段选择.Items.Insert(0, "所有");
}
}

protected void 查询按钮_Click(object sender, EventArgs e)
{
string cartype;
string carcode;

if (字段选择.SelectedValue.ToString().Equals("所有"))
{
cartype = " ";
}
else
{
cartype = 字段选择.SelectedValue.ToString();
}

if (输入关键字.Text == "")
{
carcode = " ";
}
else
{
carcode = 输入关键字.Text.ToString();
}
staticcartype = cartype;
staticcarcode = carcode;

//使用格式化绑定数据源,若为0行结果,添加一行提示
BLL.DataTableBL.GridViewDataBind(GridView1, BLL.CarBL.carInfoByTypeBind_bypara_available(staticcartype, staticcarcode));
}

//得到选择行主键,通过commandname获得跳转目标
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
//通过CommandArgument获得行号,通过DataKeys获得当前行主键
//car_id = (int)GridView1.DataKeys[Convert.ToInt32(e.CommandArgument)].Value;
car_id = Convert.ToInt32(GridView1.Rows[Convert.ToInt32(e.CommandArgument)].Cells[0].Text);
if (e.CommandName == "申请")
{
Response.Redirect("ApplicationDetail.aspx");
}
else if (e.CommandName == "维修")
{
Response.Redirect("FixDetail.aspx");
}
}


//gridview翻页
protected void GridView1_PageIndexChanged(Object sender, EventArgs e)
{

}
//gridview翻页
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
//this.GridView1.PageIndex = e.NewPageIndex;
if (GridView1.EditIndex != -1)
{
e.Cancel = true;
int newPageNumber = e.NewPageIndex + 1;
}
else
{
GridView1.PageIndex = e.NewPageIndex;
//使用格式化绑定数据源,若为0行结果,添加一行提示
BLL.DataTableBL.GridViewDataBind(GridView1, BLL.CarBL.carInfoByTypeBind_bypara_available(staticcarcode, staticcarcode));
}

}
protected void 字段选择_SelectedIndexChanged(object sender, EventArgs e)
{

}
}
}


希望各位能不吝赐教,自己确实调试许久也没找到方向,谢谢
...全文
83 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧