我用一个datalist做了一个编辑数据库数据的例子,主要后台代码如下:
private void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack)
this.mybind();
}private void DataList1_CancelCommand(object source, System.Web.UI.WebControls.DataListCommandEventArgs e)
{
DataList1.EditItemIndex=-1;
this.mybind();
}
private void DataList1_UpdateCommand(object source, System.Web.UI.WebControls.DataListCommandEventArgs e)
{
int index = (int)DataList1.DataKeys[e.Item.ItemIndex];
TextBox newName=(TextBox)e.Item.FindControl("企业名称");
TextBox newMaster=(TextBox)e.Item.FindControl("法人代表");
string oleconn= "update 企业明细表 set 企业名称='"+newName.Text+"',法人代表='"+newMaster.Text+"' where ID="+index.ToString();
OleDbConnection conn2= new OleDbConnection(ConfigurationSettings.AppSettings["DataBaseCon"].ToString());
OleDbCommand cmd = new OleDbCommand(oleconn,conn2);
conn2.Open();
try
{
cmd.ExecuteNonQuery();
DataList1.EditItemIndex=-1;
this.mybind();
}
catch(Exception err)
{
Response.Write(err.ToString());
}
finally
{
conn2.Close();
}
}private void DataList1_EditCommand(object source, System.Web.UI.WebControls.DataListCommandEventArgs e)
{
DataList1.EditItemIndex=e.Item.ItemIndex;
this.mybind();
}
private void mybind()
{
OleDbConnection conn=new OleDbConnection(ConfigurationSettings.AppSettings["connStr"].ToString());
OleDbDataAdapter da=new OleDbDataAdapter("select * from 企业明细表",conn);
DataSet ds=new DataSet();
try
{
da.Fill(ds,"企业明细表");
DataList1.DataSource = ds.Tables["企业明细表"];
DataList1.DataBind(); }
catch(Exception error)
{
Response.Write(error.ToString());
}
}
运行条时候错误提示如下:
索引超出范围。必须为非负值并小于集合大小。参数名: index 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。参数名: index源错误: 
行 60:  private void DataList1_UpdateCommand(object source, System.Web.UI.WebControls.DataListCommandEventArgs e)
行 61:  {
行 62:  int index = (int)DataList1.DataKeys[e.Item.ItemIndex];
行 63:  TextBox newName=(TextBox)e.Item.FindControl("企业名称");
行 64:  TextBox newMaster=(TextBox)e.Item.FindControl("法人代表");
 源文件: c:\inetpub\wwwroot\newdiy\webform3.aspx.cs    行: 62 
问题出在哪里了?

解决方案 »

  1.   

    补充说明:当我在datalist中所含文本框里面修改数据后,点击“更新”按钮才这样的,其中对更新按钮的html定义是:
    <asp:Button id="update" runat="server" Text="更新" CommandName="update"></asp:Button>
      

  2.   

    int index=Convert.ToInt32(e.Item.Cells[0].Text);
      

  3.   

    首先,下面这一
    <asp:Button id="update" runat="server" Text="更新" CommandName="update"></asp:Button>里面的CommandName参数是错误的,必须区分大小写
    <asp:Button id="update" runat="server" Text="更新" CommandName="Update"></asp:Button>其次,你没有定义主键,在这一句
    DataList1.DataSource = ds.Tables["企业明细表"];
    下面,你应当
    DataList1.DataKeyField = "你的主键名";
      

  4.   

    按照门槛大哥的意思解决了,可是又出现了以下提示错误:
    未将对象引用设置到对象的实例。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。源错误: 
    行 63:  TextBox newName=(TextBox)e.Item.FindControl("企业名称");
    行 64:  TextBox newMaster=(TextBox)e.Item.FindControl("法人代表");
    行 65:  string oleconn= "update 企业明细表 set 企业名称='"+newName.Text+"',法人代表='"+newMaster.Text+"' where ID="+index.ToString();
    行 66:  OleDbConnection conn2= new OleDbConnection(ConfigurationSettings.AppSettings["DataBaseCon"].ToString());
    行 67:  OleDbCommand cmd = new OleDbCommand(oleconn,conn2);
     源文件: c:\inetpub\wwwroot\newdiy\webform3.aspx.cs    行: 65 
    哪里错了?
      

  5.   

    问题在你的index这个变量,你是怎么取的?还是如下吗?
    int index = (int)DataList1.DataKeys[e.Item.ItemIndex];
    你还是应该这样:
    string index = DataList1.DataKeys[e.Item.ItemIndex];
    你的出错信息表明,你取到了一个错误的值.如果你真的设置了主键,那么是不会出现这样的问题的.