0

いくつかのパラメーターをSilverlightの子ウィンドウを介して、PDF形式のCrystalレポートをホストするaspxページに渡します。ファイルフォルダのステッカーの印刷機能です。プリントアウトシートのテンプレートに似たCrystalレポートを作成しました。ラベルを印刷するためにデータベースから情報を取得するストアドプロシージャを作成しました。

重要なのは、スキップ関数を作成して、ユーザーが適切な量のラベルをスキップして次のラベルに印刷できるようにすることです。ユーザーが1つのラベルまたは複数のラベルを印刷できるように拡張しました。

そこで、foreachループを使用して、1つのラベルが入り、1つのラベルが印刷され、複数のラベルが入り、複数のラベルが印刷されるようにすることを考えました。実行した場合を除いて、コレクションが変更されたというエラーが表示され、列挙操作が実行されない場合があります。これがテーブルの作成とスキップコードです。

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())を作成するにはどうすればよいですか。これらは、2つの異なる方法でこの同じaspxbtwに渡されます。

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 に答える