从一个GridView中进行多项选择,并在另一个GridView中显示数据

时间:2014-02-05 02:50:33

标签: c# asp.net gridview viewstate

我在行命令上遇到GridView问题,并在另一个GridView中堆叠数据:

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);

    //Get selected standard packing name
    int rowNo = int.Parse(e.CommandArgument.ToString());
    SPUname = this.gvSPU.DataKeys[rowNo].Value.ToString();
    lblSPUname.Text = SPUname;

    //Get the record from view state
    itemList = tempDistSPUI;

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

    //Save the last record to view state
    this.tempDistSPUI = itemList;
}

假设当我第一次从gvSPU选择一行时,它会返回一个填充了数据的itemList并显示在gvFinalised中。我想要做的是如果我从gvSPU选择了另一行,gvFinalised中的先前记录仍将存在,并从第二个选定的行中堆叠另一个itemList而不是先擦除记录并显示最新的itemList数据。

我正在使用viewState,但它不起作用。

修改

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]));
        }

        //Check if itemList and prodVariantDetail list contains any duplicate records
        var Gdupes = itemList.GroupBy(x => new { x.id }).Where(x => x.Skip(1).Any()).ToList();
        List<DistributionStandardPackingUnitItems> dupes = Gdupes.SelectMany(x => x).ToList();
        prodVariantDetail = itemList.Except(dupes).ToList();

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

        foreach (GridViewRow gr in gvFinalised.Rows)
        {
            //Get the product packaging quantity by productName
            string name = gr.Cells[1].Text;
            int productQuantity = packBLL.getProductQuantityByName(name, distributionID);
            TextBox tb = (TextBox)gr.Cells[5].FindControl("tbQuantity");

            if (productQuantity == 0)
            {
                tb.Text = productQuantity.ToString();
            }
            else
            {
                tb.Text = (productQuantity / packagesNeeded).ToString();
            }
        }

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

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

1 个答案:

答案 0 :(得分:0)

问题如下:

//Get the record from view state
itemList = tempDistSPUI; 

// here itemList will be replaced 
itemList = packBLL.getAllDistSPUItemByDistributionIDnSPUName(distributionID, SPUname);

首先,您将ViewState中的tempDistSPUI分配给itemList,然后在下一行替换itemList。您需要将从packBLL.getAllDistSPUItemByDistributionIDnSPUName返回的元素添加到itemList,而不是替换itemList。以下是我将使用List.AddRange Method执行的操作:

itemList = tempDistSPUI; 

// add the returned elements to itemList
itemList.AddRange(packBLL.getAllDistSPUItemByDistributionIDnSPUName(distributionID, SPUname));

<强>更新
为了防止与前面的元素重复:

itemList = tempDistSPUI; 

List<DistributionStandardPackingUnitItems> itemListNew = new List<DistributionStandardPackingUnitItems>();
itemListNew = packBLL.getAllDistSPUItemByDistributionIDnSPUName(distributionID, SPUname);

// get all previous IDs in a List<int>
List<int> previousIDs = itemList.Select(x => x.id).ToList();

// filter itemListNew and add the elements to itemList
itemList.AddRange(itemListNew.Where(x => !previousIDs.Contains(x.id));