0

我通过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) 产生正确数量的标签,无论是 1 个还是 10 个。我猜测修改长度(跳过)会导致集合被修改,但如果是这样,我如何在调整参数差异的同时为它创建一个单独的列表(.ToList())。它们通过两种不同的方式传递到同一个 aspx 顺便说一句。

4

1 回答 1

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 集合,您只需构建所需的新行并将它们一次性添加到集合中。

于 2012-08-24T18:23:34.533 回答