偶在两个页面里都用到了gridview这个控件,一个页能能删除,一个页面总报错,郁闷死我了!
我用的是access作为数据库,表里有两个字段id(自动编号),name(文本)
下面是我出错页的代码。
html代码片段
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnRowDeleting="GridView1_RowDeleting">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text=<%#Eval("name") %>></asp:Label>
<asp:LinkButton ID="lbtnDel" runat="server" CommandName ="delete">删除</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>页面.cs代码
using System;
using System.Data;
using System.Configuration;
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.OleDb;public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
bind();
}
} protected void bind()
{
string connstring = "Provider=Microsoft.Jet.OleDb.4.0;Data Source=" + Server.MapPath("~/DB/db.mdb");
string sql = "select * from [log_main]";
OleDbConnection conn = new OleDbConnection(connstring);
OleDbDataAdapter dr = new OleDbDataAdapter(sql,conn );
DataSet ds = new DataSet();
dr.Fill(ds);
GridView1.DataSource = ds;
GridView1.DataBind(); }
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
int id= (int) GridView1.DataKeys[e.RowIndex-1].Value;//点页面上的删除按钮这行报错!
//索引超出范围。必须为非负值并小于集合大小。
//参数名: index
}
}他总说我的索引超出范围,我高断点看过e.RowIndex是正确的索引呀!要怎么在gridview自定义模板中删除行呀!
我用的是access作为数据库,表里有两个字段id(自动编号),name(文本)
下面是我出错页的代码。
html代码片段
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnRowDeleting="GridView1_RowDeleting">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text=<%#Eval("name") %>></asp:Label>
<asp:LinkButton ID="lbtnDel" runat="server" CommandName ="delete">删除</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>页面.cs代码
using System;
using System.Data;
using System.Configuration;
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.OleDb;public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
bind();
}
} protected void bind()
{
string connstring = "Provider=Microsoft.Jet.OleDb.4.0;Data Source=" + Server.MapPath("~/DB/db.mdb");
string sql = "select * from [log_main]";
OleDbConnection conn = new OleDbConnection(connstring);
OleDbDataAdapter dr = new OleDbDataAdapter(sql,conn );
DataSet ds = new DataSet();
dr.Fill(ds);
GridView1.DataSource = ds;
GridView1.DataBind(); }
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
int id= (int) GridView1.DataKeys[e.RowIndex-1].Value;//点页面上的删除按钮这行报错!
//索引超出范围。必须为非负值并小于集合大小。
//参数名: index
}
}他总说我的索引超出范围,我高断点看过e.RowIndex是正确的索引呀!要怎么在gridview自定义模板中删除行呀!
解决方案 »
- SQL列名无效问题
- 无比灵异的啊!!!!!!!!!!
- 50分请教:求时间差的一个难题,HELP^^^^^^
- 求教各位:我在使用 ReportViewer 控件,在设置报表为本地报表后,在运行时,出现错误.
- 使用window.alert()方法会影响页面样式?
- asp.net2.0布署的问题,为什么出现错误.cs文件不存在
- 我代码中Insert操作怎么不能进行啊?
- webconfig配置问题。。
- 急急急!!!在TextBox中显示图片
- 当无法使用grideview时候,如何快速输出Tale?
- 高分求一解!不够在加!
- 在VS2005中,做ASP.net的时候,为什么放上去的控件不可以托动,很不方便啊....这是为什么?
应该是
int id= (int) GridView1.DataKeys[e.ItemIndex].ToString()
datasourceid="CustomersSqlDataSource"
autogeneratecolumns="true"
autogeneratedeletebutton="true"
datakeynames="CustomerID"
runat="server">
</asp:gridview>
<asp:sqldatasource id="CustomersSqlDataSource"
selectcommand="Select [CustomerID], [CompanyName], [Address], [City], [PostalCode], [Country] From [Customers]"
deletecommand="Delete from Customers where CustomerID = @CustomerID"
connectionstring="<%$ ConnectionStrings:NorthWindConnectionString%>"
runat="server">
</asp:sqldatasource>
e.ItemIndex 是在Grid当前绑定页内的索引。
如果你当前页不是第一页自然会报错
------------解决方法
给linkbutton加个属性
<asp:LinkButton CommandArgument='=<%#Eval("id") %>'/>
int id= int.Parse(e.CommandArgument);
如果没有这个e.CommandArgument
int id= int.Parse((LinkButton)e.CommandSource).CommandArgument);
总之,你在代码中把LinkButton的CommandArgument取出来作为数据表的ID
sprc_lcl(cool一生) 在RowDeleting事件里e没有ItemIndex,
<asp:LinkButton CommandArgument='<%#Eval("id") %>'/>
我认为这个属性很有用,直接传ID值,肯定不会错
protected void gvDiary_RowDeleting(object sender, GridViewDeleteEventArgs e)//删除留言
{
int dataId = (int)gvDiary.DataKeys[e.RowIndex].Value;
dc.delData(dataId);
gvDiary.DataSource = dc.View();
gvDiary.DataBind();
}
这个就不会报错
老孟这个你看了吗?
<asp:gridview id="CustomersGridView"
datasourceid="CustomersSqlDataSource"
autogeneratecolumns="true"
autogeneratedeletebutton="true"
datakeynames="ID"//这个有吗??
runat="server">
</asp:gridview>
还有这个你也试试:
<asp:LinkButton CommandArgument='<%#Eval("id") %>'/>
应该是
int id= (int) GridView1.DataKeys[e.RowIndex].Value;//点页面上的删除按钮这行要不你删除第一行时会报错
就错!
我认为在这个DataKeys集合内就没有数据,
没有设置GridView1的 datakeynames="ID"属性;
还有用LinkButton的CommandArgument属性直接把当前的ID传过去