Shanna
Shanna

Reputation: 783

textboxes gets cleared while saving

I have a gridview in the popup, with 3 columns, out of which 2 are textbox column. I have added the textbox dynamically in the row data bound event. when data is entered and save button is clicked,the textboxes gets cleared and the empty values are saved. can any one one help me on this. thanks in advance code here:

      for (int r = 0; r < GridView2.Rows.Count; r++)
      {
        string sub_details = "";
        string remarks = "";
        GridViewRow gRow1 = GridView2.Rows[r];
        //  TextBox tb = (TextBox)gRow.Cells[2].FindControl("txt");        
        TextBox tb1 = (TextBox)gRow1.Cells[1].FindControl("txt1");
        TextBox tb2 = (TextBox)gRow1.Cells[2].FindControl("txt2");
        if (tb1 != null)
        {
            sub_details = tb1.Text;
            TextBox1.Text = sub_details;               
        }
        if (tb2 != null)
        {
           remarks= tb2.Text;
        }
        OdbcConnection DbConnection1 = new OdbcConnection(con1);
        OdbcCommand DbCommand1 = DbConnection1.CreateCommand();
        try
        {
            DbConnection1.Open();
            DbCommand1.CommandText = "insert  into tbl_campboss_report(site,tdate,entered_by,entered_time,details,camp_boss,sub_details,remarks)values('" + drpSites.SelectedItem.Text + "','" + txtDate.Text + "','" + Session["uname"].ToString() + "'," + ss + ",'" + lstDetails.SelectedItem.Text + "','" + txtCampBoss.Text + "','" + sub_details + "','" + remarks + "')";
            int t1 = DbCommand1.ExecuteNonQuery();
            if (t1 == 1)
            {
                DbConnection1.Close();
            }
        }
        catch (Exception ee)
        {
            DbConnection1.Close();
        }
    }

Upvotes: 0

Views: 510

Answers (2)

Jaya Kishore
Jaya Kishore

Reputation: 1

//This Metghod Will not Clear The Controls

//Keep this Method in Your .Aspx.cs Page
protected override void CreateChildControls()
 {
        base.CreateChildControls();
        // Keep your GridView Binding Code
 }

Upvotes: 0

Zo Has
Zo Has

Reputation: 13018

  1. You can achieve this task easily by placing your textboxes inside template fields in your footer row with a save button. There you can save these values to the database row by row.
  2. Using CellIndex could fail if you add a column later to your gridview.
  3. Your database code is prone to SQL injection, I advise you to use paramterized queries

Check below example

ASPX

<asp:GridView ID="gvCustomer" runat="server" AutoGenerateColumns="False" 
    ShowFooter="True" EmptyDataText="&lt;h2&gt;No records found &lt;/h2&gt;" 
    onrowdeleting="gvCustomer_RowDeleting">
    <Columns>
        <asp:TemplateField HeaderText="First name">
            <FooterTemplate>
                First Name:<asp:TextBox ID="txtFirstName" runat="server"></asp:TextBox>
            </FooterTemplate>
            <ItemTemplate>
                <asp:Label ID="lblFirstName" Text='<%#Bind("FirstName") %>' runat="server"></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Last name" >
            <FooterTemplate>
                Last Name:
                <asp:TextBox ID="txtLastName"  runat="server"></asp:TextBox>
            </FooterTemplate>
            <ItemTemplate>
                <asp:Label ID="lblLastName" Text='<%#Bind("LastName") %>' runat="server"></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Favorite fruit">
            <FooterTemplate>
                Favorite fruit:
                <asp:DropDownList ID="ddlFavFruit" runat="server">
                    <asp:ListItem Text="Apple" Value="1"></asp:ListItem>
                    <asp:ListItem Text="Mango" Value="2"></asp:ListItem>
                    <asp:ListItem Text="Orange" Value="3">Tomato</asp:ListItem>
                </asp:DropDownList>
                &nbsp;<asp:Button ID="btnSave" runat="server" Text="Save" 
                    onclick="btnSave_Click" />
            </FooterTemplate>
            <ItemTemplate>
                <asp:DropDownList ID="ddlFruits" runat="server" Enabled="False" selectedValue='<%#Bind("FruitID") %>'>
                    <asp:ListItem Text="Apple" Value="1"></asp:ListItem>
                    <asp:ListItem Text="Mango" Value="2"></asp:ListItem>
                    <asp:ListItem Text="Orange" Value="3">Tomato</asp:ListItem>
                </asp:DropDownList>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

Codebehind

protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                if (ViewState["myData"] == null)
                {
                    // initialize datatable
                    dt = new DataTable();
                    dt.Columns.Add(new DataColumn("Id", typeof(int)));
                    dt.Columns.Add(new DataColumn("FirstName", typeof(string)));
                    dt.Columns.Add(new DataColumn("LastName", typeof(string)));
                    dt.Columns.Add(new DataColumn("FruitID", typeof(int)));
                    dt.Columns[0].AutoIncrement = true;
                    dt.Columns[0].AutoIncrementSeed = 1;
                    // Add sample data
                    for (int i = 0; i <= 5; i++)
                    {
                        DataRow dr = dt.NewRow();
                        dr["FirstName"] = "Scott";
                        dr["LastName"] = "Tiger";
                        dr["FruitID"] = "2";
                        dt.Rows.Add(dr);
                    }
                    ViewState["myData"] = dt;
                }
                else
                {
                    dt = ViewState["myData"] as DataTable;
                }

                gvCustomer.DataSource = dt;
                gvCustomer.DataBind();
            }

        }
protected void btnSave_Click(object sender, EventArgs e)
    {
        // fetch controls from footer

        GridViewRow footerRow = ((Button)sender).NamingContainer as GridViewRow;
        if (footerRow != null)
        {
            // Fetch footer controls
            TextBox txtFirstName = footerRow.FindControl("txtFirstName") as TextBox;
            TextBox txtLastName = footerRow.FindControl("txtLastName") as TextBox;
            DropDownList ddlFruits = footerRow.FindControl("ddlFavFruit") as DropDownList;

            // Save to datatable
            dt = ViewState["myData"] as DataTable;
            DataRow dr = dt.NewRow();
            dr["FirstName"] = txtFirstName.Text.ToString();
            dr["LastName"] = txtLastName.Text.ToString();
            dr["FruitID"] = ddlFruits.SelectedValue;
            dt.Rows.Add(dr);
            gvCustomer.DataSource = dt;
            gvCustomer.DataBind();
            ViewState["myData"] = dt;

        }
    }

Upvotes: 2

Related Questions