0

次のコードスニペットがこのように機能するかどうかはわかりません。「開発者として」、フィールドの数が制御されておらず、同様のデータバインディングを使用して、データ表示制御の作成を自動化しようとすることがあるため、アプリケーションを確認する前に一部の人はこれを残しました:

イベントActiveReport_ReportStart()中:

    for (Ind = 1; Ind <=CM.Length; Ind++) {

        if (Ind == 1) {
            Left = ((Line)rpt.Sections["PageHeader"].Controls["lnH8"]).Left + 0.05f;
        } else if (Ind == 2) {
            Left = ((Line)rpt.Sections["PageHeader"].Controls["lnH9"]).Left + 0.05f;
        } else if (Ind == 3) {
            Left = ((Line)rpt.Sections["PageHeader"].Controls["lnH10"]).Left + 0.05f;
        }

        TextBox TB = new TextBox();
        TB.Size = ((Label)rpt.Sections["PageHeader"].Controls["tbColorway1"]).Size;
        TB.Font = ((Label)rpt.Sections["PageHeader"].Controls["tbColorway1"]).Font;
        TB.Width = ((Label)rpt.Sections["PageHeader"].Controls["tbColorway1"]).Width;
        TB.Height = ((Label)rpt.Sections["PageHeader"].Controls["tbColorway1"]).Height;
        TB.VerticalAlignment = VerticalTextAlignment.Top;
        TB.Location =  new System.Drawing.PointF(Left, ((Label)rpt.Sections["PageHeader"].Controls["tbColorway1"]).Top);
        TB.DataField = "ColorText" + Ind + ColorwayNumber;
        rpt.Sections["Detail"].Controls.Add(TB);

プレビュー時にコンパイルエラーは発生せず、自動生成されない他のフィールド(ReporHeader、ReportFooter)も正しく表示されますが、IMHOは、このメカニズムを詳細セクション内のサブレポートに置き換える方がよいと思います。もちろん、これらはフィールドは、レポートの詳細セクションに表示する必要があります。とにかく、実行時にテキストボックスまたはラベルを自動生成できる場合は、このコードが機能しなかった理由を上司に説明する必要があるため、いくつかの推奨事項を確認したいと思います。代わりにサブレポートを使用する必要がある場合は、その方法を知る必要があります。パラメータを渡し(少なくとも、別のSQLクエリを生成するために2つのパラメータを操作する必要があります)、スクリプトを挿入するのに適切な「イベント」は何ですか。


最も重要な問題は、sqlqueryの戻り値によって制限された実行時にレポートの詳細に追加されたフィールド/テキストボックスの数によってレポート形式の変更を取得することであることがわかりました。次に例を示します。

  1. 返されたSQLQuery値=4
  2. 詳細行1用に生成された10個のフィールド
  3. 行2の6つのフィールド
  4. 行3の4つのフィールド

詳細フィールドはSQLストアドプロシージャにバインドされています*

レポートは次のように印刷/表示されることになっています:

//Report Init
    
    ページ1 :
                         |フィールド1|フィールド2|フィールド3|フィールド4|
    -------------------------------------------------- --------
    行1| valA1 | valA2 | valA3 | valA4 |
    -------------------------------------------------- --------
    row2 | valB1 | valB2 | valB3 | valB4 |
    -------------------------------------------------- --------
    行3| valC1 | valC2 | valC3 | valC4 |
    -------------------------------------------------- --------

    2ページ :
                         |フィールド1|フィールド2|フィールド3|フィールド4|
    -------------------------------------------------- --------
    行1| valA5 | valA6 | valA7 | valA8 |
    -------------------------------------------------- --------
    row2 | valB5 | valB6 |
    -------------------------------------------------- --------
    行3                 
    -------------------------------------------------- --------

    ページ3:
                         |フィールド1|フィールド2|フィールド3|フィールド4|
    -------------------------------------------------- --------
    行1| valA9 | valA10 |
    -------------------------------------------------- --------
    行2                 
    -------------------------------------------------- --------
    行3                 
    -------------------------------------------------- --------
//End of Report

どんな助けでもありがたいです

どうもありがとう

4

1 に答える 1

1

実行時にレポートにフィールドを動的に作成してもまったく問題ありません。これらのフィールドの作成は、reportstart イベントまたはそれ以前 (つまり、ActiveReport.Run を呼び出す前) で行う必要があります。

ただし、同じロジックを配置してサブレポートにこれらのフィールドを動的に作成し、パラメーターを渡すこともできますが、一般に、サブレポートは追加のオーバーヘッド (およびほとんどの場合追加のクエリ) を課すため、サブレポートがない限り、サブレポートは使用しません。魅力的なメリット。ただし、パラメーターをサブレポートに渡す方法については、こちらのチュートリアルを参照してください。

コードで疑わしいと思われるのは、次の行だけです。

 TB.Location =  new System.Drawing.PointF(Left, ((Label)rpt.Sections["PageHeader"].Controls["tbColorway1"]).Top);

Topコントロールの値を PageHeader で使用していますがTB、詳細セクションにあります。Left 値を再利用することは理解できますが、Top 値を再利用すると、異なるセクション間で一貫性がなくなります (Top は、コントロールを含むセクションの上部からの垂直位置です)

現在、これらのフィールドがレポートに表示されない場合があるようです。問題をトラブルシューティングするために確認できること:

  • バインディングの問題か、視覚的/位置の問題かを判断します。これを行うには、テキスト ボックスに境界線や背景色などを指定して、テキストがなくても表示できるようにします (データ バインディングが失敗したため)。
  • 各テキストボックスの位置とデータフィールドの値をログファイルに記録し始めます。問題に気付いたら、ログに戻って、何が問題を引き起こしているかを特定できるかどうかを確認します (特定のインデックス、場所、またはデータフィールド値など)。
  • 最後に、ページ サイズ (システムの既定のプリンターによって決定される) が変更されておらず、動的に追加されたテキスト ボックスの 1 つが切り取られている可能性があることを確認してください。
于 2012-03-09T08:01:51.263 に答える