Mudassir Hasan
Mudassir Hasan

Reputation: 28771

GridView row not updating, text from textbox in gridview edit template not coming

I have grid view in which I want to update row but it is not happening. The datasource is a DataTable. Please help.


Below is the markup

<asp:GridView ID="GrdV" runat="server" AutoGenerateColumns="false"   
   OnRowEditing="GrdV_RowEditing"  OnRowUpdating="GrdV_RowUpdating">

 <Columns>
   <asp:TemplateField HeaderText="Clip Description">
        <ItemTemplate>
            <asp:Label ID="lblDescrptn" runat="server" Text='<%# Bind("Description") %>'>
            </asp:Label>
        </ItemTemplate>
        <EditItemTemplate>
            <asp:TextBox ID="descTbx" runat="server" Text='<%# Bind("Description") %>'>
            </asp:TextBox>
        </EditItemTemplate>
    </asp:TemplateField>

   <asp:CommandField ShowEditButton="True" />

 </Columns>

and this is code behind

    protected void GrdV_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {

        // Retrieve the row being edited.
      int index = GrdV.EditIndex;
        GridViewRow row = GrdV.Rows[index];           
        TextBox t1 = row.FindControl("descTbx") as TextBox;

        DataTable dt = (DataTable)Session["tmdataTable"];

        dt.Rows[index]["Description"] = t1.Text; //Description is a column of my DataTable
        dt.AcceptChanges();
        GrdV.EditIndex = -1;
        GrdV.DataSource = dt;
        GrdV.DataBind();

    }

On debugging , I find that textbox is passing empty string t1.Text ="" even after I have filled textbox with new values. I think the error is in line

TextBox t1 = row.FindControl("descTbx") as TextBox;

PageLoad code

    protected void Page_Load(object sender, EventArgs e)
    {

        if (!IsPostBack)
        {
            GrdV.DataSource = Session["tmdataTable"];
            GrdV.DataBind();
        }


        DataTable Finaldt = getTable();

        GrdV.DataSource = Finaldt;
        GrdV.DataBind();
        Session["tmdataTable"] = Finaldt;

    }

Upvotes: 0

Views: 2813

Answers (3)

Praveen Nambiar
Praveen Nambiar

Reputation: 4892

Alter your code a bit and check. Change EditIndex to e.RowIndex

protected void GrdV_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    GridViewRow row = GrdV.Rows[e.RowIndex]; // this line is changed      
    TextBox t1 = row.FindControl("descTbx") as TextBox;

    DataTable dt = (DataTable)Session["tmdataTable"];

    dt.Rows[row.DataItemIndex]["Description"] = t1.Text; //Description is a column of my DataTable
    dt.AcceptChanges();
    GrdV.EditIndex = -1;
    GrdV.DataSource = dt;
    GrdV.DataBind();
}

Have you done this:

protected void Page_Load(object sender, EventArgs e)
{     
    if(!IsPostBack)
    {
        GrdV.DataSource = Session["tmdataTable"];
        GrdV.DataBind();
    }
}

Upvotes: 0

mcalex
mcalex

Reputation: 6798

EditIndex isn't available, you need e.RowIndex from the GridViewUpdateEventArgs

// Retrieve the row being edited.
DataTable dt = (DataTable)Session["tmdataTable"];
GridViewRow row = GrdV.Rows[e.RowIndex];
TextBox t1 = row.FindControl("descTbx") as TextBox;

dt.Rows[row.DataItemIndex]["Description"] = t1.Text; //Description is a column of my DataTable
dt.AcceptChanges();
GrdV.EditIndex = -1;
GrdV.DataSource = dt;
GrdV.DataBind();

Upvotes: 1

Hitesh
Hitesh

Reputation: 37

 protected void GrdV_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
         if (e.Item is GridDataItem)
        {
        // Retrieve the row being edited.
      int index = GrdV.EditIndex;
        GridViewRow row = GrdV.Rows[index];           
        TextBox t1 = row.FindControl("descTbx") as TextBox;

        DataTable dt = (DataTable)Session["tmdataTable"];

        dt.Rows[index]["Description"] = t1.Text; //Description is a column of my DataTable
        dt.AcceptChanges();
        GrdV.EditIndex = -1;
        GrdV.DataSource = dt;
        GrdV.DataBind();
        }
    }

Upvotes: 0

Related Questions