无法将类型为“System.Web.UI.WebControls.HyperLink”的对象强制转换为类型“System.Web.UI.WebControls.TextBox”。
说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。异常详细信息: System.InvalidCastException: 无法将类型为“System.Web.UI.WebControls.HyperLink”的对象强制转换为类型“System.Web.UI.WebControls.TextBox”。源错误:行 69:         string empID = this.GridView1.DataKeys[e.RowIndex].Value.ToString();  
行 70:         //注意:以下cells的索引值可能会随着设计的进行发生变化,关键是正确地检测出 “公司名称”和 “联系人姓名”两个字段的索引值!!!  
行 71:         string companyname = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[5].Controls[0])).Text.ToString().Trim();  
行 72:         string  联系人姓名  = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[6].Controls[0])).Text.ToString().Trim();  
行 73:         SqlConnection con = DB.createCon();  
源文件: e:\MYASPNET\st13\Default.aspx.cs    行: 71堆栈跟踪:[InvalidCastException: 无法将类型为“System.Web.UI.WebControls.HyperLink”的对象强制转换为类型“System.Web.UI.WebControls.TextBox”。]
   _Default.GridView1_RowUpdating(Object sender, GridViewUpdateEventArgs e) in e:\MYASPNET\st13\Default.aspx.cs:71
   System.Web.UI.WebControls.GridView.OnRowUpdating(GridViewUpdateEventArgs e) +139
   System.Web.UI.WebControls.GridView.HandleUpdate(GridViewRow row, Int32 rowIndex, Boolean causesValidation) +808
   System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +855
   System.Web.UI.WebControls.GridView.OnBubbleEvent(Object source, EventArgs e) +95
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
   System.Web.UI.WebControls.GridViewRow.OnBubbleEvent(Object source, EventArgs e) +121
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
   System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) +125
   System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument) +169
   System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +9
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +176
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5563

解决方案 »

  1.   

    GridView1.Rows[e.RowIndex].Cells[5].Controls[0])不是一个TextBox,你最好使用
    GridView1.Rows[e.RowIndex].FindControl("TextBoxID") as TextBox
      

  2.   

    还是有问题..........
            companyname = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[5].Controls[0])).Text.ToString().Trim();  
            联系人姓名  = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[6].Controls[0])).Text.ToString()Trim(); 错的 是这两句
    没明白楼主的意思
      

  3.   

    无法将类型为“System.Web.UI.WebControls.HyperLink”的对象强制转换为类型“System.Web.UI.WebControls.TextBox”。提示这么明显了,你的GridView单元格是一个HyperLink,而你却将他转换成TextBox,无法强制转换。string companyname = ((HyperLink)(GridView1.Rows[e.RowIndex].Cells[5].Controls[0])).Text.ToString().Trim();   
      

  4.   

    我试过了,不可以。开始我以为Cells的序号有问题,但试了,不行
      

  5.   


    序号是从0开始的,你只要没有弄错的话,并且该列确实是HyperLink的话,那样写就不会有错。那现在又报什么错呢?
      

  6.   

    我觉得,HyperLink不能转换成TextBox ,但是应该都能转换成objet类型,所有都是objet类派生的。
    楼主想要做什么事情,如果光取值何必转换呢。
      

  7.   

        protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
             string companyname="" ;
             string 联系人姓名="";
            //  返回选定行的主键值  
            string empID = this.GridView1.DataKeys[e.RowIndex].Value.ToString();  
            //注意:以下cells的索引值可能会随着设计的进行发生变化,关键是正确地检测出 “公司名称”和 “联系人姓名”两个字段的索引值!!!  
            //companyname = ((TextBox)(GridView1.Rows[1].Cells[1].Controls[0]).FindControl("TextBox1")).Text.ToString().Trim());
            //联系人姓名 =((TextBox)(GridView1.Rows[2].Cells[1].Controls[0]).FindControl("TextBox2")).Text.ToString().Trim());
            companyname = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[1].Controls[1])).Text.ToString().Trim();
            联系人姓名 = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[2].Controls[0])).Text.ToString().Trim();  
            SqlConnection con = DB.createCon();  
            SqlCommand cmd = new SqlCommand("update  供应商  set  公司名称= '" + companyname + "',  联系人姓名='" +  联系人姓名  + "' where  供应商ID='" + empID +   "'", con);  
            con.Open();  
            cmd.ExecuteNonQuery();  
            con.Close();  
            this.GridView1.EditIndex = -1;  
            BindGrid();  
        }
      

  8.   

    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.Security;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;public partial class _Default : System.Web.UI.Page
    {
        public DataSet ds = new DataSet();//建立数据集对象  
        protected void Page_Load(object sender, EventArgs e)
        {
            //  在此处放置用户代码以初始化页面  
            if (!this.IsPostBack)
            {
                BindGrid();
            }
            this.GridView1.AllowPaging = true;
            this.GridView1.AllowSorting = true; 
        }    private void BindGrid()
        {
            //数据绑定方法  
            SqlConnection con = DB.createCon();
            SqlDataAdapter sda = new SqlDataAdapter("select * from  供应商", con);
            sda.Fill(ds, "emp");    //装填数据集DataSet  
            //和更新按钮有关,需要设置主键*****************  
            this.GridView1.DataKeyNames = new string[] { "供应商ID" };//索引关键字  
            //************************************************  
            this.GridView1.DataSource = ds.Tables["emp"].DefaultView;
            this.GridView1.DataBind();        DropDownList1.DataSource = ds.Tables["emp"].DefaultView;
            DropDownList1.DataTextField = "公司名称";//下拉列表框显示内容  
            DropDownList1.DataValueField = "供应商ID";//下拉列表框的值内容  
            DropDownList1.DataBind();
        }
        protected void lbGO_Click(object sender, EventArgs e)
        {
            GridViewRow pagerRow = GridView1.BottomPagerRow;
            TextBox pageNum = pagerRow.Cells[0].FindControl("tbPage") as TextBox;
            if (pageNum.Text != null)
            {
                if (Convert.ToInt32(pageNum.Text) > 0 && Convert.ToInt32(pageNum.Text)<= GridView1.PageCount)
                    GridView1.PageIndex = Convert.ToInt32(pageNum.Text) - 1;
            }
            BindGrid();      //调用上面的BindGrid()绑定  
        }
        protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            if (e.NewPageIndex >= 0 && e.NewPageIndex < GridView1.PageCount)
                this.GridView1.PageIndex = e.NewPageIndex;
            BindGrid();      //调用上面的BindGrid()绑定
        }
        protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
        {
            this.GridView1.EditIndex = e.NewEditIndex;
            BindGrid();  
        }
        protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
             string companyname="" ;
             string 联系人姓名="";
            //  返回选定行的主键值  
            string empID = this.GridView1.DataKeys[e.RowIndex].Value.ToString();  
            //注意:以下cells的索引值可能会随着设计的进行发生变化,关键是正确地检测出 “公司名称”和 “联系人姓名”两个字段的索引值!!!  
            //companyname = ((TextBox)(GridView1.Rows[1].Cells[1].Controls[0]).FindControl("TextBox1")).Text.ToString().Trim());
            //联系人姓名 =((TextBox)(GridView1.Rows[2].Cells[1].Controls[0]).FindControl("TextBox2")).Text.ToString().Trim());
            companyname = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[1].Controls[1])).Text.ToString().Trim();
            联系人姓名 = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[2].Controls[0])).Text.ToString().Trim();  
            SqlConnection con = DB.createCon();  
            SqlCommand cmd = new SqlCommand("update  供应商  set  公司名称= '" + companyname + "',  联系人姓名='" +  联系人姓名  + "' where  供应商ID='" + empID +   "'", con);  
            con.Open();  
            cmd.ExecuteNonQuery();  
            con.Close();  
            this.GridView1.EditIndex = -1;  
            BindGrid();  
        }
        protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            //  返回选定行的主键值  
            string SupID=this.GridView1.DataKeys[e.RowIndex].Value.ToString();  
            SqlConnection con=DB.createCon();
            SqlCommand cmd=new SqlCommand("delete  供应商  where  供应商ID='"+SupID+"'",con);  
            con.Open();  
            cmd.ExecuteNonQuery();  
            con.Close();  
            this.GridView1.EditIndex=-1;  
            BindGrid();  
        }
        protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
        {
            //单向排序设置  
            //ViewState["Order"] = "ASC"; //按递增排序,递减为:DESC  
            //上行代码要放在此事件以外,可放在page_load事件中  
            //双向排序设置:如果原来是降序则改为升序,反之亦然  
            if((string)ViewState["Order"]=="DESC")  
                ViewState["Order"] = "ASC";  
            else  
                ViewState["Order"] = "DESC";       
            SqlConnection con=DB.createCon();      //连接  FPNWIND  库  
            SqlDataAdapter sda  =  new SqlDataAdapter("select * from  供应商",con);  
            //DataSet对象  ds   已经在前面定义);  
            sda.Fill(ds,"emp");  
            //设定默认视图DefaultView来排序  
            ds.Tables["emp"].DefaultView.Sort=e.SortExpression+" "+ViewState["Order"].ToString();  
            this.GridView1.DataSource=ds.Tables["emp"].DefaultView;  
            this.GridView1.DataBind();  
        }
        protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
        {    }
        protected void Button1_Click(object sender, EventArgs e)
        {
            foreach (GridViewRow dl in this.GridView1.Rows)
            {
                CheckBox chk = (CheckBox)dl.FindControl("chkSelect");
                if (chk.Checked)
                {
                    this.Label3.Text += this.GridView1.DataKeys[dl.RowIndex].Value.ToString()+ ", ";
                }
            } 
        }
        protected void Button2_Click(object sender, EventArgs e)
        {
            SqlConnection con=DB.createCon();  
            SqlCommand cmd = new SqlCommand("delete from  供应商  where  供应商ID='"
                +DropDownList1.SelectedItem.Value+"'",con);  
            con.Open();  
            cmd.ExecuteNonQuery();  
            con.Close();  
            this.GridView1.EditIndex = -1;
            this.BindGrid();
        }
        protected void Button3_Click(object sender, EventArgs e)
        {
            this.Label3.Text = "";
        }
        protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            this.GridView1.EditIndex = -1;
            BindGrid();
        }
    }
      

  9.   

    无法将类型为“System.Web.UI.LiteralControl”的对象强制转换为类型“System.Web.UI.WebControls.TextBox”。
    说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。异常详细信息: System.InvalidCastException: 无法将类型为“System.Web.UI.LiteralControl”的对象强制转换为类型“System.Web.UI.WebControls.TextBox”。源错误:行 74:         //联系人姓名 =((TextBox)(GridView1.Rows[2].Cells[1].Controls[0]).FindControl("TextBox2")).Text.ToString().Trim());
    行 75:         companyname = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[1].Controls[1])).Text.ToString().Trim();
    行 76:         联系人姓名 = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[2].Controls[0])).Text.ToString().Trim();  
    行 77:         SqlConnection con = DB.createCon();  
    行 78:         SqlCommand cmd = new SqlCommand("update  供应商  set  公司名称= '" + companyname + "',  联系人姓名='" +  联系人姓名  + "' where  供应商ID='" + empID +   "'", con);