【问题标题】:Collection was modified; enumeration operation might not execute on create收藏已修改;枚举操作可能不会在创建时执行
【发布时间】:2012-08-25 02:23:34
【问题描述】:

我通过 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 顺便说一句。

【问题讨论】:

标签: asp.net crystal-reports foreach datatable


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

【讨论】:

  • 这是我想要的方式,但它仍然填充空白标签,其中六个(我选择跳过的数量)
  • 您能否跳过代码并使用调试器来确定数据行是否填充了您期望的数据行?我怀疑它可能不是。所以就像在即时窗口中一样:? drJob["PieceType"].ToString() 看看它会返回什么。
  • 是的,你是对的,他们回来是空的,我想我是通过 dr = tb.NewRow(); 添加空白行tb.Rows.Add(dr);我想我需要修改我的存储过程以创建要传递的单个“范围”作业
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
相关资源
最近更新 更多