收集被修改;枚举操作可能无法在create上执行

时间:2012-08-24 18:16:35

标签: asp.net crystal-reports foreach datatable

我将一些参数通过silverlight子窗口传递到一个aspx页面,该页面以pdf格式存储我的水晶报告。它是文件夹上贴纸的打印功能。我创建了水晶报告以重新打印打印输出表的模板。我创建了一个存储过程,从数据库中获取信息以打印标签。

最重要的是,我创建了一个跳过功能,因此用户可以跳过批准的标签数量,以便在下一个标签上打印。我扩展了它,因此用户只能打印一个标签或多个标签。

所以我想使用一个foreach循环,所以一个标签进来,它打印一个标签,多个标签进来,它打印多个。除非我运行它,我得到错误集合被修改,枚举操作可能不会执行。这是创建表和跳过代码。

try
        {
            _skip = Request.QueryString["_skip"];
            _Report = Request.QueryString["_Report"];
            _jobnum = Request.QueryString["_jobnum"];
            jobnum1 = Request.QueryString["jobnum1"];
            jobnum2 = Request.QueryString["jobnum2"];
            addedBy = Request.QueryString["addedBy"];
            date = Request.QueryString["date"];

            // Create Table
            tb = new DataTable();
            tb.Columns.Add("FileName", Type.GetType("System.String"));
            tb.Columns.Add("PieceType", Type.GetType("System.String"));
            tb.Columns.Add("PieceNumber", Type.GetType("System.String"));
            tb.Columns.Add("JobNumber", Type.GetType("System.String"));
            tb.Columns.Add("OpenDate", Type.GetType("System.String"));
            tb.Columns.Add("Market", Type.GetType("System.String"));
            tb.Columns.Add("MarketYear", Type.GetType("System.String"));
            tb.Columns.Add("BusinessName", Type.GetType("System.String"));

            int length;
            int.TryParse(_skip, out length);
            length = Convert.ToInt16(_skip);

            // Populate Blank Rows to skip labels
            for (int i = 0; i < length; i++)
            {
                dr = tb.NewRow();
                tb.Rows.Add(dr);
            }

            //Create rows depending on how many jobs come in.
            foreach (DataRow drJob in tb.Rows)
            {
                dr = tb.NewRow();
                dr["FileName"] = drJob["PieceType"].ToString() + drJob["PieceNumber"].ToString();
                dr["PieceType"] = drJob["PieceType"].ToString();
                dr["PieceNumber"] = drJob["PieceNumber"].ToString();
                dr["JobNumber"] = drJob["JobNumber"].ToString();
                dr["OpenDate"] = drJob["OpenDate"].ToString();
                dr["Market"] = drJob["Market"].ToString();
                dr["MarketYear"] = drJob["MarketYear"].ToString();
                dr["BusinessName"] = drJob["BusinessName"].ToString();
                tb.Rows.Add(dr);
            }
            ShowPDF(tb);
        }

        catch (Exception ex)
        {
        }

因此,在捕获期间,它会显示该错误。我试图在tb.Rows的末尾添加一个.ToList(),但它不受支持。我搜索了一下并尝试了以下代码

foreach (DataRow drJob in tb.Rows.Cast<DataRow>().ToList())

这部分实际上已经完成,但生成了空白标签,并为我选择跳过的数量创建了标签。(它会跳过'9'行/表,然后生成'9'标签用于打印)

我的问题是,如何将foreach循环修改为1)没有错误; 2)产生正确数量的标签,无论是一个还是十个。我猜测修改长度(跳过)导致集合被修改,但如果是这样,我如何在调整参数差异的同时为它创建一个单独的列表(.ToList())。它们通过两种不同的方式传递给同一个aspx btw。

1 个答案:

答案 0 :(得分:1)

我就是这样做的:

        //Create rows depending on how many jobs come in.
        List<DataRow> newRows = new List<DataRow>();

        foreach (DataRow drJob in tb.Rows)
        {
            dr = tb.NewRow();
            dr["FileName"] = drJob["PieceType"].ToString() + drJob["PieceNumber"].ToString();
            dr["PieceType"] = drJob["PieceType"].ToString();
            dr["PieceNumber"] = drJob["PieceNumber"].ToString();
            dr["JobNumber"] = drJob["JobNumber"].ToString();
            dr["OpenDate"] = drJob["OpenDate"].ToString();
            dr["Market"] = drJob["Market"].ToString();
            dr["MarketYear"] = drJob["MarketYear"].ToString();
            dr["BusinessName"] = drJob["BusinessName"].ToString();
            newRows.Add(dr);
        }

        foreach(DataRow dr in newRows)
             tb.Rows.Add(dr);

这样您就不会在迭代期间尝试修改Rows集合,只需构建所需的新行并将它们一次性添加到集合中。