我将一些参数通过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。
答案 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集合,只需构建所需的新行并将它们一次性添加到集合中。