Haris Georgiou
Haris Georgiou

Reputation: 67

Textbox In gridview not saving its value in table

I have a gridview gv_Products and a gridview Gv_selected. My products gridview has a checkbox that when is checked the selected row is entered in the gv_selected gridview.
I have added a textbox in gv_selected gridiew to enter the quantity i want to reorder. The quantity that i enter loses its value after i press the submit button.

<asp:GridView ID="gvSelected" runat="server" 
    AutoGenerateColumns = "False" Font-Names = "Arial" CssClass="gridviewsSmall" Font-Size = "11pt" 
    OnRowDataBound="GridView_gvSelected_RowDataBound" EnableViewState="False"                                    
    EmptyDataText = "No Records Selected"  >
        <Columns>
         <asp:BoundField DataField="ProductId" HeaderText="Product ID" ReadOnly="True" 
            SortExpression="ProductId" />
        <asp:TemplateField HeaderText="Product No" SortExpression="ProductNo">
            <ItemTemplate>
                <asp:Label ID="Label2" runat="server" Text='<%# Bind("ProductNo") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Product Name" SortExpression="Product_name">
            <ItemTemplate>
                <asp:Label ID="Label3" runat="server" Text='<%# Bind("Product_name") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
         <asp:BoundField DataField="SupplierId" HeaderText="Supplier ID" ReadOnly="True" 
            SortExpression="SupplierId" />
            <asp:TemplateField HeaderText="Quantity" SortExpression="Quantity">
                <ItemTemplate>
                    <asp:TextBox ID="TextBox1" runat="server"  Text='<%#Bind("Quantity") %>'></asp:TextBox>
                </ItemTemplate>
            </asp:TemplateField>
 </Columns>  
 </asp:GridView>
 <asp:Button ID="btnSendOrder" Visible="false" runat="server" Text="Send Order" 
onclick="btnSendOrder_Click" />

Here is my code behind for adding rows in gvSelected gridview

       private DataTable CreateDataTable()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("ProductId");
        dt.Columns.Add("ProductNo");
        dt.Columns.Add("Product_name");
        dt.Columns.Add("SupplierId");
        dt.Columns.Add("Quantity");

        dt.AcceptChanges();
        return dt;
    }

    private DataTable AddRow(GridViewRow gvRow, DataTable dt)
    {

        DataRow[] dr = dt.Select("ProductId = '" + gvRow.Cells[3].Text + "'");
        if (dr.Length <= 0)
        {
            dt.Rows.Add();
            dt.Rows[dt.Rows.Count - 1]["ProductId"] = gvRow.Cells[3].Text;
            dt.Rows[dt.Rows.Count - 1]["ProductNo"] = (gvRow.FindControl("Label2") as Label).Text;
            dt.Rows[dt.Rows.Count - 1]["Product_name"] = (gvRow.FindControl("Label3") as Label).Text;
            dt.Rows[dt.Rows.Count - 1]["SupplierId"] = (gvRow.FindControl("Label5") as Label).Text;
            dt.Rows[dt.Rows.Count - 1]["Quantity"] = 0;
            dt.AcceptChanges();
        }
        return dt;
    }

    protected void CheckBox_CheckChanged(object sender, EventArgs e)
    {
        GetData();
        SetData();
        BindSecondaryGrid();

    }

    private void BindSecondaryGrid()
    {
        DataTable dt = (DataTable)ViewState["SelectedRecords"];
        gvSelected.DataSource = dt;
        gvSelected.DataBind();
    }

And here is the submit button!

protected void btnSendOrder_Click(object sender, EventArgs e)
    {

        t_supplier_orders newOrder = new t_supplier_orders();

        newOrder.UserName = User.Identity.Name;
        newOrder.Order_date = DateTime.Now;


        newOrder.Order_status = "Pending";
        MembershipUser myObject = Membership.GetUser();
        Guid UserID = new Guid(myObject.ProviderUserKey.ToString());
        newOrder.UserId = UserID;
        newOrder.SupplierId = Convert.ToInt32(ddl1.SelectedValue);
        newOrder.Received_date = null;


        Bohemian.t_supplier_orders.AddObject(newOrder);
        Bohemian.SaveChanges();


        //------------------------------------------------------------------------+
        //  Create a new OderDetail Record for each item in the gvSelected     |
        //------------------------------------------------------------------------+

        foreach (GridViewRow row in gvSelected.Rows)
        {

            {
                t_supplier_orders_details od = new t_supplier_orders_details();

                     TextBox txt1 = (TextBox)gvSelected.FindControl("TextBox1");

                    od.OrderId = newOrder.OrderId;
                    od.ProductId = Convert.ToInt32(row.Cells[0].Text);
                    od.Product_name = (row.FindControl("Label3") as Label).Text;
                    od.ProductNo = (row.FindControl("Label2") as Label).Text;

                    od.Quantity = Convert.ToInt32(txt1.text);

                    Bohemian.t_supplier_orders_details.AddObject(od);

            }
        }

       Bohemian.SaveChanges();
       lblSuccess.Text = "The Order has been successfully sent to supplier!!";
        lblSuccess.ForeColor=System.Drawing.Color.BlueViolet;
        lblSuccess.Font.Bold = true;

    }

Upvotes: 1

Views: 1404

Answers (1)

Tim Schmelter
Tim Schmelter

Reputation: 460018

I assume that you are assigning the DataSource and DataBind the GridView on every postback. That will overwite all changes.

So wrap your code in a !IsPostBack check:

protected void Page_Load()
{
    if(!IsPostBack)
    {
        BindSecondaryGrid();
    }
}

By the way, you should not store the DataTable in ViewState since that will blow it up.

Upvotes: 1

Related Questions