我的代码如下:
public class WebForm2 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Label Label1;
protected System.Web.UI.WebControls.DataGrid DataGrid1;

private void BindData()
{
SqlConnection con=new SqlConnection(ConfigurationSettings.AppSettings["conStr"]);
con.Open(); SqlDataAdapter sda =new SqlDataAdapter("select * from teleInfor",con);
DataSet ds=new DataSet();
sda.Fill(ds);
this.DataGrid1.DataSource=ds;
this.DataGrid1.DataKeyField="id";
this.DataGrid1.DataBind(); ds.Dispose();
sda.Dispose();
con.Close();
}
private void Page_Load(object sender, System.EventArgs e)
{
BindData();
} #region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{    
this.DataGrid1.CancelCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_CancelCommand);
this.DataGrid1.EditCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_EditCommand);
this.DataGrid1.UpdateCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_UpdateCommand);
this.DataGrid1.DeleteCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_DeleteCommand);
this.Load += new System.EventHandler(this.Page_Load); }
#endregion private void DataGrid1_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
this.DataGrid1.EditItemIndex=(int)e.Item.ItemIndex;
            BindData();
} private void DataGrid1_CancelCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
this.DataGrid1.EditItemIndex=-1;
BindData();
} private void DataGrid1_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
SqlConnection con=new SqlConnection(ConfigurationSettings.AppSettings["conStr"]);
con.Open(); SqlCommand com=new SqlCommand("update teleInfor set name=@name,mobilTel=@mobilTel where id=@id",con );
com.Parameters.Add(new SqlParameter("@name",SqlDbType.NVarChar,50));
com.Parameters.Add(new SqlParameter("@mobilTel",SqlDbType.NVarChar,50));
com.Parameters.Add(new SqlParameter("@id",SqlDbType.Int));
com.Parameters["@name"].Value=((TextBox)e.Item.FindControl("tbname"));
com.Parameters["@mobilTel"].Value=((TextBox)e.Item.FindControl("tbphone"));
com.Parameters["@id"].Value=this.DataGrid1.DataKeys[(int)e.Item.ItemIndex]; com.ExecuteNonQuery();
this.DataGrid1.EditItemIndex=-1;     con.Close();
            BindData();
} private void DataGrid1_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
SqlConnection con=new SqlConnection(ConfigurationSettings.AppSettings["conStr"]);
con.Open(); SqlCommand cm=new SqlCommand("delete from teleInfor where id=@id");
cm.Parameters.Add(new SqlParameter("@id",SqlDbType.Int));
cm.Parameters["@id"].Value=this.DataGrid1.DataKeys[(int)e.Item.ItemIndex]; cm.ExecuteNonQuery();
con.Close();
BindData(); }
}当我点击更新后,出现如下错误:对象必须实现 IConvertible。 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.InvalidCastException: 对象必须实现 IConvertible。源错误: 
行 92:  com.Parameters["@id"].Value=this.DataGrid1.DataKeys[(int)e.Item.ItemIndex];
行 93: 
行 94:  com.ExecuteNonQuery();
行 95:  this.DataGrid1.EditItemIndex=-1;
行 96: 
 源文件: c:\inetpub\wwwroot\test\webform2.aspx.cs    行: 94 堆栈跟踪: 
[InvalidCastException: 对象必须实现 IConvertible。]
   System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream) +723
   System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +194
   test.WebForm2.DataGrid1_UpdateCommand(Object source, DataGridCommandEventArgs e) in c:\inetpub\wwwroot\test\webform2.aspx.cs:94
   System.Web.UI.WebControls.DataGrid.OnUpdateCommand(DataGridCommandEventArgs e) +109
   System.Web.UI.WebControls.DataGrid.OnBubbleEvent(Object source, EventArgs e) +507
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +26
   System.Web.UI.WebControls.DataGridItem.OnBubbleEvent(Object source, EventArgs e) +100
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +26
   System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) +120
   System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +115
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +18
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +138
   System.Web.UI.Page.ProcessRequestMain() +1277 当我点击删除后,又出现如下错误:
ExecuteReader: Connection 属性尚未初始化。 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.InvalidOperationException: ExecuteReader: Connection 属性尚未初始化。源错误: 
行 108: cm.Parameters["@id"].Value=this.DataGrid1.DataKeys[(int)e.Item.ItemIndex];
行 109:
行 110: cm.ExecuteNonQuery();
行 111: con.Close();
行 112: BindData();
 源文件: c:\inetpub\wwwroot\test\webform2.aspx.cs    行: 110 堆栈跟踪: 
[InvalidOperationException: ExecuteReader: Connection 属性尚未初始化。]
   System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean executing) +251
   System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream) +80
   System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +194
   test.WebForm2.DataGrid1_DeleteCommand(Object source, DataGridCommandEventArgs e) in c:\inetpub\wwwroot\test\webform2.aspx.cs:110
   System.Web.UI.WebControls.DataGrid.OnDeleteCommand(DataGridCommandEventArgs e) +109
   System.Web.UI.WebControls.DataGrid.OnBubbleEvent(Object source, EventArgs e) +589
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +26
   System.Web.UI.WebControls.DataGridItem.OnBubbleEvent(Object source, EventArgs e) +100
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +26
   System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) +120
   System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +115
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +18
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +138
   System.Web.UI.Page.ProcessRequestMain() +1277 -------------------------------------------------------------------------------
版本信息: Microsoft .NET Framework 版本:1.1.4322.573; ASP.NET 版本:1.1.4322.573 请教高手,这到底是怎么回事,我弄了好久都没有弄明白,谢谢。

解决方案 »

  1.   

    private void Page_Load(object sender, System.EventArgs e)
    {
    BindData();
    }
    BindData();应该放在if(!Page.IsPostBack)里
      

  2.   

    第一点:
    private void Page_Load(object sender, System.EventArgs e)
    {
                           if(!Page.IsPostBack)
                               { 
    BindData();
                               }
    }第2点:删除时  创建的Command对象没有设置Connection
    第3点:获取ID的时候 com.Parameters["@id"].Value=this.DataGrid1.DataKeys[(int)this.DataGrid1.DataKeys[索引]  这个获取的是DataKey类型的 而不是int 型的``自己检查看看
      

  3.   

    if(!Page.IsPostBack)

    BindData();
    }
      

  4.   

    SqlCommand cm=new SqlCommand("delete from teleInfor where id=@id");
    ===================
    改为:
    SqlCommand cm=new SqlCommand("delete from teleInfor where id=@id",con);