简体   繁体   中英

Text box in gridview not auto post back

My gridview missing previous data when post back. Here is the scenario, when I detect insufficient stock from gvFinalised gridview, I get the category, then I get the product with highest stock and display in gvSuggested gridview.

But let's say in my gvFinalised , there are three product with three different categories is insufficient, let's say they are Noodles, Canned Food and Beverages. It was supposed to display three different products with highest stock each from different categories in gvSuggested .

However, my problem now is, it just display the last items. For example, in this scenario, Beverages. The data before Beverages just get wiped out.

Here is the code on how I detect insufficient stock :

protected void tbQuantity_TextChanged(object sender, EventArgs e)
{
    tempList = new Dictionary<string, string>();
    distSPUItemList = new Dictionary<string, int>();
    bool valid = true;
    string quantityStr = "", prodID = "";
    int packagesNeeded = 0, totalUnit = 0, quantity = 0;

    //Get the total packages needed for this distribution
    packagesNeeded = prodPackBLL.getPackagesNeededByDistributionID(distributionID);

    foreach (GridViewRow gr in gvFinalised.Rows)
    {
        //Clear label error message
        Label lblCheckAmount = gr.FindControl("lblCheckAmount") as Label;
        lblCheckAmount.Text = "";

        //Get the product variant ID which set as DataKeyNames and product quantity from selected row index
        prodID = gvFinalised.DataKeys[gr.RowIndex].Value.ToString();

        var tbQuantity = gr.FindControl("tbQuantity") as TextBox;
        if (tbQuantity != null)
        {
            //Check if the input is numeric
            quantityStr = tbQuantity.Text;
            if (!int.TryParse(quantityStr, out quantity))
            {
                lblCheckAmount.Text = "Non-numeric input!";
                TextBox tb = (TextBox)gr.FindControl("tbQuantity") as TextBox;
            }
            else
            {
                //Add both objects into Dictionary
                tempList.Add(prodID, quantityStr);
            }
        }
    }

    //Portion to check the storage level for each products stored in tempList
    //Loop thru tempList. key as prod variant ID, tempList.Keys as quantity
    foreach (string key in tempList.Keys)
    {
        //Get total unit of each products
        totalUnit = prodPackBLL.getTotalProductUnit(key);
        valid = true;

        //Check if unitQuantity exceed storage level
        if (((Convert.ToInt32(tempList[key])) * packagesNeeded) > totalUnit)
        {
            //Get the label control in gridview
            foreach (GridViewRow gr in gvFinalised.Rows)
            {
                if (key == gvFinalised.DataKeys[gr.RowIndex].Value.ToString())
                {
                    //Change the color of textBox and display the insufficient message
                    valid = false;
                    //Automatically uncheck the checkBox if invalid
                    TextBox tb = (TextBox)gr.FindControl("tbQuantity") as TextBox;
                    Label lblCheckAmount = gr.FindControl("lblCheckAmount") as Label;
                    lblCheckAmount.Text = "Insufficient stock!";

                    //Here is the place where I collect the data and display in gvSuggested
                    getSuggested(key);
                }
            }
        }
        else
        {
            if (totalUnit - ((Convert.ToInt32(tempList[key])) * packagesNeeded) == 0)
            {

                foreach (GridViewRow gr in gvFinalised.Rows)
                {
                    if (key == gvFinalised.DataKeys[gr.RowIndex].Value.ToString())
                    {
                        valid = true;
                        Label lblCheckAmount = gr.FindControl("lblCheckAmount") as Label;
                        lblCheckAmount.Attributes["style"] = "color:#ffb848";
                        lblCheckAmount.Text = "Stock becomes 0!";
                    }
                }
            }
        }

        //Portion to check for valid products to be inserted into distSPUItemList
        if (valid)
        {
            //Set the textBox color
            foreach (GridViewRow gr in gvFinalised.Rows)
            {
                if (key == gvFinalised.DataKeys[gr.RowIndex].Value.ToString())
                {
                    TextBox tb = (TextBox)gr.FindControl("tbQuantity") as TextBox;
                }
            }
            //Validated items store into another list to perform Sql statement when button on click
            distSPUItemList.Add(key, (Convert.ToInt32(tempList[key]) * packagesNeeded));
        }
    }
}

And here is the getSuggested() method to populate my gvSuggeted :

protected void getSuggested(string prodVariantID)
{
    string categoryName = prodPackBLL.getCategoryByProdVariantID(prodVariantID);

    //Get the list of substitute product with highest storage level  sorted in descending order
    List<ProductPacking> prodSubstitute = new List<ProductPacking>();
    List<string> lstCategory = new List<string>();
    List<string> prodIDList = new List<string>();
    List<DistributionStandardPackingUnitItems> distSPUItem = new List<DistributionStandardPackingUnitItems>();

    distSPUItem = this.SuggestedItems;

    //Find list of substitute with highest stock level and replace the product
    prodSubstitute = prodPackBLL.getProductIDWithHighestStock(categoryName);

    for (int count = 0; count < prodSubstitute.Count; count++)
    {
        //To prevent duplication of same product and select those catories which are in current category and counting them and taking them if there are less than 1 occurrences
        if (!prodIDList.Contains(prodSubstitute[count].id) && !(lstCategory.Where(x => x.Equals(categoryName)).Select(x => x).Count() >= 2))
        {
            prodIDList.Add(prodSubstitute[count].id);
            lstCategory.Add(categoryName);
        }
    }

    for (int j = 0; j < prodIDList.Count; j++)
    {
        //Get the detail of the product added into prodList and add it into distSPUItem List
        distSPUItem.Add(packBLL.getSPUItemDetailByID(prodIDList[j]));
    }

    gvSuggested.DataSource = distSPUItem;
    gvSuggested.DataBind();

    this.SuggestedItems = distSPUItem;
}

private List<DistributionStandardPackingUnitItems> SuggestedItems
{
    get
    {
        if (ViewState["SuggestedItems"] == null)
        {
            return new List<DistributionStandardPackingUnitItems>();
        }
        else
        {
            return (List<DistributionStandardPackingUnitItems>)ViewState["SuggestedItems"];
        }
    }
    set
    {
        ViewState["SuggestedItems"] = value;
    }
}

I used a viewState to store the data when postback. However, it does not work. This line in gvSuggested :

this.SuggestedItems = distSPUItem; 

causing my textbox in gridView not auto post back. If I removed it, the error above appear again. Any guides? Thanks in advance.

请启用tbQuantity文本框EnableAutoPostBack = True

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM