从gridview更新事件更新数据表

时间:2014-08-09 11:33:28

标签: c# asp.net gridview

我有一个数据表,我填充数据,但如果我想编辑该行,我收到错误

无法将类型为“System.Web.UI.WebControls.DataControlLinkBut​​ton”的对象强制转换为“System.Web.UI.WebControls.TextBox”。

填充gridview的代码是

public void addTochkout(string type, string no)
        {
            DataTable dt = (DataTable)Session["table_chkout"];
            DataRow dr = dt.NewRow();
            dr[0] = type;            
            dr[1] = no;
            dt.Rows.Add(dr);
            Session["table_detail"] = dt; //save dt to new session
            gridbind();

        }

public void gridbind()
        {
            //gridview
            if (Session["table_detail"] != null)
            {
                DataTable dt = (DataTable)Session["table_detail"];
                if (dt.Rows.Count > 0)
                {
                    chkoutDetail.DataSource = dt;
                    chkoutDetail.DataBind();
                    string countitems = dt.Rows.Count.ToString();
                    Session["cart_counter"] = countitems;
                }
            }
            else
            {
                chkoutDetail.DataSource = null;
                chkoutDetail.DataBind();
            }
        }

现在,当我尝试更新gridview时,我从行

中得到上述错误
dt.Rows[row.DataItemIndex]["TicketType"] = ((TextBox)(row.Cells[1].Controls[0])).Text;

错误的整个代码块是

protected void TaskGridView_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        //Retrieve the table from the session object.
        DataTable dt = (DataTable)Session["table_detail"];

        //Update the values.
        GridViewRow row = chkoutDetail.Rows[e.RowIndex];
        dt.Rows[row.DataItemIndex]["TicketType"] = ((TextBox)(row.Cells[1].Controls[0])).Text;
        dt.Rows[row.DataItemIndex]["Price"] = ((TextBox)(row.Cells[2].Controls[0])).Text;
        //Reset the edit index.
        chkoutDetail.EditIndex = -1;

        //Bind data to the GridView control.
        gridbind();
    }

如果你能帮助我解决这个问题,我将非常感激。

西蒙

2 个答案:

答案 0 :(得分:1)

请注意,启用“编辑”选项后,网格视图中行的编辑模式的第一个和第二个单元格是链接按钮(“更新”和“取消”)。因此,您可能需要在获取行中的文本框时更改索引

//Cell number 2 for the first textbox. 0 for update link and 1 for cancel link
dt.Rows[row.DataItemIndex]["TicketType"] = ((TextBox)(row.Cells[2].Controls[0])).Text;

答案 1 :(得分:0)

我在发布之后就已经发现了我的问题,但它不允许我回答这个问题。

继承我的解决方案

 protected void TaskGridView_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {

        try 
        {
        //    //Update the values.

            string type = e.NewValues[0].ToString();
            string qty = e.NewValues[1].ToString();

            //Retrieve the table from the session object.
            DataTable dt = (DataTable)Session["table_detail"];

            dt.Rows[e.RowIndex]["TicketType"] = type;
            dt.Rows[e.RowIndex]["TicketNo"] = qty;
            dt.AcceptChanges();

            chkoutDetail.EditIndex = -1;

            //Bind data to the GridView control.
            gridbind();

            int value1 = Convert.ToInt32(ddtickettype.SelectedItem.Value);
            int value2 = Convert.ToInt32(ddTicketno.SelectedItem.Value);
            string tType = ddtickettype.SelectedItem.Text;
            string tNo = ddTicketno.SelectedItem.Text;

            int prevTotal = Convert.ToInt32(lblAmount.Text);
            int total = (value1 * value2) + prevTotal;
            Session["TotalAmount"] = total.ToString();
            if (Session["TotalAmount"] != null)
            {
                lblAmount.Text = Session["TotalAmount"].ToString();
            }


        }
        catch(Exception ex)
        {
            Response.Write(ex.Message);
        }

    }