错误如下
索引超出范围。必须为非负值并小于集合大小。参数名: index
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。参数名: index
行 51: SqlCommand myCommand = new SqlCommand(updateCmd, myConnection);
行 52: myCommand.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int, 4));
行 53: myCommand.Parameters.Add(new SqlParameter("@Title", SqlDbType.NVarChar, 100));
行 54: myCommand.Parameters.Add(new SqlParameter("@Author", SqlDbType.NVarChar, 50));
行 55: myCommand.Parameters["@Id"].Value = DataGrid1.DataKeys[(int)E.Item.ItemIndex];
源文件: e:\asp\music\admin\updata.aspx.cs 行: 53
using System;
using System.Globalization ;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Web;
using Acme;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace Music.admin
{
/// <summary>
/// updata 的摘要说明。
/// </summary>
public class updata : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid DataGrid1;
protected System.Web.UI.WebControls.Label Label1;
protected System.Web.UI.WebControls.TextBox TextBox1;
protected System.Web.UI.HtmlControls.HtmlGenericControl Message;
public SqlConnection myConnection;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
myConnection=new SqlConnection("server=localhost;uid=sa;pwd=12278082;database=music");
if(!IsPostBack)
BindGrid();
}
public void DataGrid1_Edit(object sender,DataGridCommandEventArgs E)
{
DataGrid1.EditItemIndex=(int)E.Item.ItemIndex;
BindGrid();
}
public void DataGrid1_Cancel(object sender, DataGridCommandEventArgs E)
{
DataGrid1.EditItemIndex = -1;
BindGrid();
}
public void DataGrid1_Update(object sender, DataGridCommandEventArgs E)
{
string updateCmd = "UPDATE musics SET id = @Id, title= @Title, author = @Author,";
SqlCommand myCommand = new SqlCommand(updateCmd, myConnection);
myCommand.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int, 4));
myCommand.Parameters.Add(new SqlParameter("@Title", SqlDbType.NVarChar, 100));
myCommand.Parameters.Add(new SqlParameter("@Author", SqlDbType.NVarChar, 50));
myCommand.Parameters["@Id"].Value = DataGrid1.DataKeys[(int)E.Item.ItemIndex];
String[] cols = {"@Id","@Title","@Author",};
Message.InnerHtml = "";
int numCols = E.Item.Cells.Count;
for (int i=2; i<numCols-1; i++) //skip first, second and last column
{
String colvalue =((System.Web.UI.WebControls.TextBox)
E.Item.Cells[i].Controls[0]).Text;
// check for invalid values
switch (cols[i-1])
{
case "@Title":
if ( !InputValidator.IsValidAnsiName(colvalue) )
{
Message.InnerHtml += "ERROR: Last Name - " + InputValidator.AnsiNameErrorString + "<br>";
}
break;
case "@Author":
if ( !InputValidator.IsValidAnsiName(colvalue) )
{
Message.InnerHtml += "ERROR: First Name - " + InputValidator.AnsiNameErrorString + "<br>";
}
break;
}
if (i<6 && colvalue == "")
{
Message.InnerHtml += "ERROR: Null values not allowed for " + cols[i-1] + "<br>";
}
myCommand.Parameters[cols[i-1]].Value = colvalue;
}
if ( Message.InnerHtml != "" )
{
Message.Style["color"] = "red";
return;
}
//append last row, converting true/false values to 0/1
if (String.Compare(((System.Web.UI.WebControls.TextBox)
E.Item.Cells[numCols-1].Controls[0]).Text, "true", true, CultureInfo.InvariantCulture)==0)
myCommand.Parameters["@Contract"].Value = "1";
else
myCommand.Parameters["@Contract"].Value = "0";
myCommand.Connection.Open();
try
{
myCommand.ExecuteNonQuery();
Message.InnerHtml = "<b>Record Updated</b><br>" + updateCmd;
DataGrid1.EditItemIndex = -1;
}
catch (SqlException e)
{
if (e.Number == 2627)
Message.InnerHtml = "ERROR: A record already exists with the same primary key";
else
Message.InnerHtml = "ERROR: Could not update record, please ensure the fields are correctly filled out";
Message.Style["color"] = "red";
}
myCommand.Connection.Close();
BindGrid();
}
string updateCmd = "UPDATE musics SET id = @Id, title= @Title, author = @Author,";
多了一个逗号!应为:
string updateCmd = "UPDATE musics SET id = @Id, title= @Title, author = @Author";
什么情况下提示错误!
参看:QuickStart:
http://localhost/quickstart/util/srcview.aspx?path=/quickstart/aspplus/samples/webforms/data/datagrid6.src
把 switch (cols[i-1]) 改成 switch (cols[i-2]) 再试试。另外你的SQL语句也是错的,就算能执行,也是把所有记录的id、title和author都更新了。
--------------------------------
AspNetPager 免费分页控件4.2版发布,同时发布最新源代码,欢迎下载:http://www.webdiyer.com
加DataGrid1.EditItemIndex = e.Item.ItemIndex试试