我添加了编辑按钮列,然后写了UpdateCommand事件,编译通过,可是执行的时候就出现下面的错误:对象必须实现 IConvertible。 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.InvalidCastException: 对象必须实现 IConvertible。事件代码如下,请各位前辈帮忙指点一下,谢谢private void DataGrid1_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
this.conn.Open();
string sql="update Employees set LastName=@LastName,FirstName=@FirstName,Title=@Title,Address=@Address,City=@City,Region=@Region,Country=@Country,HomePhone=@HomePhone where EmployeeID=@EmployeeID";
SqlCommand cmd=new SqlCommand(sql,this.conn);
string eid;
eid=this.DataGrid1.DataKeys[(int)e.Item.ItemIndex].ToString();

cmd.Parameters.Add(new SqlParameter("@LastName",SqlDbType.NVarChar,20));
cmd.Parameters.Add(new SqlParameter("@FirstName",SqlDbType.NVarChar,10));
cmd.Parameters.Add(new SqlParameter("@Title",SqlDbType.NVarChar,30));
cmd.Parameters.Add(new SqlParameter("@Address",SqlDbType.NVarChar,60));
cmd.Parameters.Add(new SqlParameter("@City",SqlDbType.NVarChar,15));
cmd.Parameters.Add(new SqlParameter("@Region",SqlDbType.NVarChar,15));
cmd.Parameters.Add(new SqlParameter("@Country",SqlDbType.NVarChar,15));
cmd.Parameters.Add(new SqlParameter("@HomePhone",SqlDbType.NVarChar,24)); TextBox txtLastName=(TextBox)e.Item.Cells[1].Controls[0];
TextBox txtFirstName=(TextBox)e.Item.Cells[2].Controls[0];
TextBox txtTitle=(TextBox)e.Item.Cells[3].Controls[0];
TextBox txtAdress=(TextBox)e.Item.Cells[4].Controls[0];
TextBox txtCity=(TextBox)e.Item.Cells[5].Controls[0];
TextBox txtRegion=(TextBox)e.Item.Cells[6].Controls[0];
TextBox txtCountry=(TextBox)e.Item.Cells[7].Controls[0];
TextBox txtHomePhone=(TextBox)e.Item.Cells[8].Controls[0]; //cmd.Parameters["@EmployeeID"].Value=EmployeeID;
cmd.Parameters["@LastName"].Value=txtLastName.Text;
cmd.Parameters["@FirstName"].Value=txtFirstName.Text;
cmd.Parameters["@Title"].Value=txtTitle.Text;
cmd.Parameters["@Address"].Value=txtAdress;
cmd.Parameters["@City"].Value=txtCity.Text;
cmd.Parameters["@Region"].Value=txtRegion.Text;
cmd.Parameters["@Country"].Value=txtCountry.Text;
cmd.Parameters["@HomePhone"].Value=txtHomePhone.Text;
//            
// try
// {
cmd.ExecuteNonQuery();
// }
// catch(Exception error)
// {
//
// }
// finally
// {
this.conn.Close();
this.DataGrid1.EditItemIndex=-1;
databind();
// }

解决方案 »

  1.   

    如果你是使用Convert.ToBoolean(obj),Convert.ToString(obj) ....这种方式,那么obj要实现IConvertible接口
      

  2.   

    TextBox txtLastName=(TextBox)e.Item.Cells[1].Controls[0];
    TextBox txtFirstName=(TextBox)e.Item.Cells[2].Controls[0];
    TextBox txtTitle=(TextBox)e.Item.Cells[3].Controls[0];
    TextBox txtAdress=(TextBox)e.Item.Cells[4].Controls[0];
    TextBox txtCity=(TextBox)e.Item.Cells[5].Controls[0];
    TextBox txtRegion=(TextBox)e.Item.Cells[6].Controls[0];
    TextBox txtCountry=(TextBox)e.Item.Cells[7].Controls[0];
    TextBox txtHomePhone=(TextBox)e.Item.Cells[8].Controls[0];可能在这个地方出现问题  
    不知道你为什么要这样用   
    难道你在编辑的时候动态生成TextBox 就算你想这样,语句也不对啊。
    你的页面上应该已经有文本框了吧。直接把值往里面丢不就可以了么。
    this.txtLastName.Text = e.Item.Cells[1].Text;
      

  3.   

    添加cmd.Parameters.Add(new SqlParameter("@EmployeeID",SqlDbType.VarChar));cmd.Parameters["@EmployeeID"].Value=eid;取消注释吧
      

  4.   

    To maojun1980(jjmao)编辑时是自动生成TextBox的,修改的值是通过TextBox传回去的To impeller(竹子)EmployeeID是只读的,不可编辑的按你说的我也试了下,还是一样的问题
      

  5.   

    你的代码有点乱,看我的吧:
    HTML的代码:
    <form id="Form1" method="post" runat="server">
    <h2 id="H21">实现DataGrid控件中的编辑更新</h2>
    <asp:DataGrid id="dgEdit" runat="server" BorderColor="#3366CC" BorderStyle="None" BorderWidth="1px"
    BackColor="White" CellPadding="4" AutoGenerateColumns="False" DataKeyField="EmployeeID" Width="320px">
    <SelectedItemStyle Font-Bold="True" ForeColor="#CCFF99" BackColor="#009999"></SelectedItemStyle>
    <ItemStyle ForeColor="#003399" BackColor="White"></ItemStyle>
    <HeaderStyle Font-Bold="True" ForeColor="#CCCCFF" BackColor="#003399"></HeaderStyle>
    <FooterStyle ForeColor="#003399" BackColor="#99CCCC"></FooterStyle>
    <Columns>
    <asp:TemplateColumn HeaderText="LastName">
    <ItemTemplate>
    <asp:Label runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.LastName") %>' ID="Label1" NAME="Label1">
    </asp:Label>
    </ItemTemplate>
    </asp:TemplateColumn>
    <asp:TemplateColumn HeaderText="FirstName">
    <ItemTemplate>
    <asp:Label runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.FirstName") %>' ID="Label2" NAME="Label2">
    </asp:Label>
    </ItemTemplate>
    </asp:TemplateColumn>
    <asp:TemplateColumn HeaderText="City">
    <ItemTemplate>
    <asp:Label runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.City") %>' ID="Label3" NAME="Label3">
    </asp:Label>
    </ItemTemplate>
    <EditItemTemplate>
    <asp:TextBox runat="server" ID="txtCity" Text='<%# DataBinder.Eval(Container, "DataItem.City") %>'>
    </asp:TextBox>
    </EditItemTemplate>
    </asp:TemplateColumn>
    <asp:EditCommandColumn ButtonType="LinkButton" UpdateText="&lt;img src=../../images/save.gif border=0 alt='保存'/&gt;"
    CancelText="&lt;img src=../../images/cancel.gif border=0 alt='取消'/&gt;" EditText="&lt;img src=../../images/edit.gif border=0 alt='编辑'/&gt;"></asp:EditCommandColumn>
    </Columns>
    <PagerStyle HorizontalAlign="Left" ForeColor="#003399" BackColor="#99CCCC" Mode="NumericPages"></PagerStyle>
    </asp:DataGrid>
    </form>
    后台代码:
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;
    using System.Configuration;
    namespace CommonFunction.数据绑定控件
    {
    /// <summary>
    /// DataGridEdit 的摘要说明。
    /// </summary>
    public class DataGridEdit : System.Web.UI.Page
    {
    protected System.Web.UI.WebControls.DataGrid dgEdit; private void Page_Load(object sender, System.EventArgs e)
    {
    //页面初试化时进行数据绑定
    if(!IsPostBack)
    DataGridDataBind();
    }
    private void DataGridDataBind()
    {
    //定义数据连接对象,其中数据库连接字符串是在Web.Config文件中定义的
    SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionSqlServer"].ToString());
    //创建数据适配器对象
    SqlDataAdapter da = new SqlDataAdapter("select top 5 EmployeeID,LastName,FirstName,City from Employees",conn);
    //创建DataSet对象
    DataSet ds = new DataSet();
    try
    {
    //填充数据集
    da.Fill(ds,"testTable");
    //进行数据绑定
    dgEdit.DataSource = ds.Tables["testTable"];
    dgEdit.DataBind();
    }
    catch(Exception error)
    {
    //输出异常信息
    Response.Write(error.ToString());
    }
    } #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
    this.dgEdit.CancelCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.dgEdit_CancelCommand);
    this.dgEdit.EditCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.dgEdit_EditCommand);
    this.dgEdit.UpdateCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.dgEdit_UpdateCommand);
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion private void dgEdit_CancelCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    //设置DataGrid控件的编辑项的索引为-1,既取消编辑
    dgEdit.EditItemIndex = -1;
    //数据绑定
    DataGridDataBind();
    } private void dgEdit_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    //设置DataGrid控件的编辑项的索引为选择的当前项
    dgEdit.EditItemIndex = e.Item.ItemIndex;
    //数据绑定
    DataGridDataBind();
    } private void dgEdit_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    //取得编辑行的关键字段的值
    int empID = (int)dgEdit.DataKeys[e.Item.ItemIndex];
    //取得文本框中输入的内容
    TextBox newCity = (TextBox)e.Item.FindControl("txtCity");
    //定义SQL语句
    string sqlCom = "update Employees set City='" + newCity.Text + "' where EmployeeID="+empID.ToString();
    //定义数据连接对象,其中数据库连接字符串是在Web.Config文件中定义的
    SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionSqlServer"].ToString());
    //定义命令对象
    SqlCommand cmd = new SqlCommand(sqlCom,conn);
    //打开数据连接
    conn.Open();
    try
    {
    //执行SQL命令
    cmd.ExecuteNonQuery();
    //取消编辑
    dgEdit.EditItemIndex = -1;
    DataGridDataBind();
    }
    catch(Exception err)
    {
    //输出异常信息
    Response.Write(err.ToString());
    }
    finally
    {
    //关闭连接对象
    conn.Close();
    }
    }
    }
    }
      

  6.   

    高手“fanliang11(本人是北大青鸟的) ”我可以请教你一个问题吗?我的QQ:59046564
      

  7.   

    本人发一个群号给大家,大家一起来讨论ASP.NET,号码:21642729
      

  8.   

    private void DataGrid1_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    this.conn.Open();
    string sql="update Employees set LastName=@LastName,FirstName=@FirstName,Title=@Title,Address=@Address,City=@City,Region=@Region,Country=@Country,HomePhone=@HomePhone where EmployeeID=@EmployeeID";
    SqlCommand cmd=new SqlCommand(sql,this.conn);
    string eid;
    eid=this.DataGrid1.DataKeys[(int)e.Item.ItemIndex].ToString();

    cmd.Parameters.Add(new SqlParameter("@LastName",SqlDbType.NVarChar,20));
    cmd.Parameters.Add(new SqlParameter("@FirstName",SqlDbType.NVarChar,10));
    cmd.Parameters.Add(new SqlParameter("@Title",SqlDbType.NVarChar,30));
    cmd.Parameters.Add(new SqlParameter("@Address",SqlDbType.NVarChar,60));
    cmd.Parameters.Add(new SqlParameter("@City",SqlDbType.NVarChar,15));
    cmd.Parameters.Add(new SqlParameter("@Region",SqlDbType.NVarChar,15));
    cmd.Parameters.Add(new SqlParameter("@Country",SqlDbType.NVarChar,15));
    cmd.Parameters.Add(new SqlParameter("@HomePhone",SqlDbType.NVarChar,24));
    cmd.Parameters.Add(new SqlParameter("@EmployeeID",SqlDbType.NVarChar)); TextBox txtLastName=(TextBox)e.Item.Cells[1].Controls[0];
    TextBox txtFirstName=(TextBox)e.Item.Cells[2].Controls[0];
    TextBox txtTitle=(TextBox)e.Item.Cells[3].Controls[0];
    TextBox txtAdress=(TextBox)e.Item.Cells[4].Controls[0];
    TextBox txtCity=(TextBox)e.Item.Cells[5].Controls[0];
    TextBox txtRegion=(TextBox)e.Item.Cells[6].Controls[0];
    TextBox txtCountry=(TextBox)e.Item.Cells[7].Controls[0];
    TextBox txtHomePhone=(TextBox)e.Item.Cells[8].Controls[0]; cmd.Parameters["@EmployeeID"].Value=eid;
    cmd.Parameters["@LastName"].Value=txtLastName.Text;
    cmd.Parameters["@FirstName"].Value=txtFirstName.Text;
    cmd.Parameters["@Title"].Value=txtTitle.Text;
    cmd.Parameters["@Address"].Value=txtAdress.Text;
    cmd.Parameters["@City"].Value=txtCity.Text;
    cmd.Parameters["@Region"].Value=txtRegion.Text;
    cmd.Parameters["@Country"].Value=txtCountry.Text;
    cmd.Parameters["@HomePhone"].Value=txtHomePhone.Text;
                
    try
    {
    cmd.ExecuteNonQuery();
    }
    catch(Exception error)
    {

    }
    finally
    {
    this.conn.Close();
    this.DataGrid1.EditItemIndex=-1;
    databind();
    }
    }  }