Question

So basically I am doing a manage packaging item system. The scenario is, when I select from gvSPU, gvFinalised should display the item in database. After that, when I add new item into the gvFinalised, it supposed to keep stacking up the items instead of wiping out the previous record and display the added latest one. Here is the code:

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

protected void gvSPU_OnRowCommand(object sender, GridViewCommandEventArgs e)
{
    int packagesNeeded = prodPackBLL.getPackagesNeededByDistributionID(distributionID);

    int rowNo = int.Parse(e.CommandArgument.ToString());
    SPUname = this.gvSPU.DataKeys[rowNo].Value.ToString();
    lblSPUname.Text = SPUname;

    List<DistributionStandardPackingUnitItems> templist = new List<DistributionStandardPackingUnitItems>();
    templist = tempDistSPUI;

    templist = packBLL.getAllDistSPUItemByDistributionIDnSPUName(distributionID, SPUname);
    gvFinalised.DataSource = templist;
    gvFinalised.DataBind();

    this.tempDistSPUI = templist;
}

When gvSPU row is selected, it should store all the records into templist and display in gvFinalised.

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

protected void lbnAdd_Click(object sender, EventArgs e)
{
    List<ProductPacking> prodVariantDetail = new List<ProductPacking>();

    int packagesNeeded = prodPackBLL.getPackagesNeededByDistributionID(distributionID);

    // get the last product variant IDs from ViewState
    prodVariantIDList = this.SelectedVariantDetailIDs;

    foreach (RepeaterItem ri in Repeater1.Items)
    {
        GridView gvProduct = (GridView)ri.FindControl("gvProduct");
        foreach (GridViewRow gr in gvProduct.Rows)
        {
            CheckBox cb = (CheckBox)gr.FindControl("cbCheckRow");
            //Prevent gvFinalised to store duplicate products
            if (cb.Checked && !prodVariantIDList.Any(i => i == gvProduct.DataKeys[gr.RowIndex].Value.ToString()))
            {
                // add the corresponding DataKey to idList
                prodVariantIDList.Add(gvProduct.DataKeys[gr.RowIndex].Value.ToString());
            }
        }
    }

    for (int i = 0; i < prodVariantIDList.Count; i++)
    {
        prodVariantDetail.Add(prodPackBLL.getProdVariantDetailByID(prodVariantIDList[i]));
    }

    gvFinalised.DataSource = prodVariantDetail;
    gvFinalised.DataBind();

    // save prodVariantIDList to ViewState
    this.SelectedVariantDetailIDs = prodVariantIDList;
}

When add button is on click, it should append with the record in gridview instead of wiping them off and insert the checked one.

I am using the viewState to store the record between postbacks. However, when I try to add new item into gvFinalised, the previous record which in the templist will disappear and the gvFinalised will be populated with the result from prodVariantDetail list.

Any guide? Thanks in advance.

EDIT

List<DistributionStandardPackingUnitItems> itemList = new List<DistributionStandardPackingUnitItems>();
protected void gvSPU_OnRowCommand(object sender, GridViewCommandEventArgs e)
    {
        int packagesNeeded = prodPackBLL.getPackagesNeededByDistributionID(distributionID);

        int rowNo = int.Parse(e.CommandArgument.ToString());
        SPUname = this.gvSPU.DataKeys[rowNo].Value.ToString();
        lblSPUname.Text = SPUname;

        itemList = tempDistSPUI;

        itemList = packBLL.getAllDistSPUItemByDistributionIDnSPUName(distributionID, SPUname);
        gvFinalised.DataSource = itemList;
        gvFinalised.DataBind();

        this.tempDistSPUI = itemList;
    }

    protected void lbnAdd_Click(object sender, EventArgs e)
    {
        List<DistributionStandardPackingUnitItems> prodVariantDetail = new List<DistributionStandardPackingUnitItems>();

        int packagesNeeded = prodPackBLL.getPackagesNeededByDistributionID(distributionID);

        // get the last product variant IDs from ViewState
        prodVariantIDList = this.SelectedVariantDetailIDs;

        foreach (RepeaterItem ri in Repeater1.Items)
        {
            GridView gvProduct = (GridView)ri.FindControl("gvProduct");
            foreach (GridViewRow gr in gvProduct.Rows)
            {
                CheckBox cb = (CheckBox)gr.FindControl("cbCheckRow");
                //Prevent gvFinalised to store duplicate products
                if (cb.Checked && !prodVariantIDList.Any(i => i == gvProduct.DataKeys[gr.RowIndex].Value.ToString()))
                {
                    // add the corresponding DataKey to idList
                    prodVariantIDList.Add(gvProduct.DataKeys[gr.RowIndex].Value.ToString());
                }
            }
        }

        for (int i = 0; i < prodVariantIDList.Count; i++)
        {
            prodVariantDetail.Add(packBLL.getProdVariantDetailByID(prodVariantIDList[i]));
        }

        for (int j = 0; j < itemList.Count; j++)
        {
            prodVariantDetail.Add(itemList[j]);
        }

        gvFinalised.DataSource = prodVariantDetail;
        gvFinalised.DataBind();

        }

        // save prodVariantIDList to ViewState
        this.SelectedVariantDetailIDs = prodVariantIDList;
    }
Was it helpful?

Solution

You have to add the elements of tempDistSPUI into prodVariantDetail before binding prodVariantDetail to gvFinalised.

Here's what I would do using List.AddRange Method:

protected void lbnAdd_Click(object sender, EventArgs e)
{
    List<DistributionStandardPackingUnitItems> prodVariantDetail = new List<DistributionStandardPackingUnitItems>();

    int packagesNeeded = prodPackBLL.getPackagesNeededByDistributionID(distributionID);

    // get the last product variant IDs from ViewState
    prodVariantIDList = this.SelectedVariantDetailIDs;

    foreach (RepeaterItem ri in Repeater1.Items)
    {
        GridView gvProduct = (GridView)ri.FindControl("gvProduct");
        foreach (GridViewRow gr in gvProduct.Rows)
        {
            CheckBox cb = (CheckBox)gr.FindControl("cbCheckRow");
            //Prevent gvFinalised to store duplicate products
            if (cb.Checked && !prodVariantIDList.Any(i => i == gvProduct.DataKeys[gr.RowIndex].Value.ToString()))
            {
                // add the corresponding DataKey to idList
                prodVariantIDList.Add(gvProduct.DataKeys[gr.RowIndex].Value.ToString());
            }
        }
    }

    for (int i = 0; i < prodVariantIDList.Count; i++)
    {
        prodVariantDetail.Add(packBLL.getProdVariantDetailByID(prodVariantIDList[i]));
    }

    // get the content of tempDistSPUI from ViewState
    itemList = this.tempDistSPUI;

    // add all elements of itemList to prodVariantDetail
    prodVariantDetail.AddRange(itemList);

    gvFinalised.DataSource = prodVariantDetail;
    gvFinalised.DataBind();

    // save prodVariantIDList to ViewState
    this.SelectedVariantDetailIDs = prodVariantIDList;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top