1

テーブル/グリッド形式でページにデータを印刷しようとしています。現時点では動作していますが、すべて手動で描画されます。各セルの幅と高さのかなりハードコードされた値。

私がやろうとしているのは、それをより一般的なソリューションに変えることです。すべてのデータを含むある種のオブジェクトを作成し、基本的にそれ自体をレンダリングします。

私が抱えている問題は、各セルの高さを決定する方法を見つけて、そこに含まれるデータに対して十分な大きさであることを確認することです。

私が現時点で持っているものは次のようなものです:

protected override void OnPrintPage(PrintPageEventArgs e)
{
    DrawPageHeader();

    List<ItemDTO> ItemsForPage = GetItemsToRenderOnThisPage();

    for (int i = 1; i < ItemsForPage.Count; i ++)
    {
        //Each column is rendered in this method. The X and Y start positions are passed, plus the width of the column.
        DrawColumn(g, ItemsForPage[0], column1X, totalWidth / ItemsForPage.Count, itemStartY);
    }
}

private int DrawColumnForItem(Graphics g, ItemDTO item, int startPoint, int columnWidth, int rowPosition)
{
    //Draw the vertical Lines
    g.DrawLine(linePen, lineLeft, rowPosition, lineLeft, lineHeight);
    g.DrawLine(linePen, lineRight, rowPosition, lineRight, lineHeight);
    g.DrawLine(linePen, startPoint - 2, rowPosition, startPoint - 2, lineHeight);

    // (85 characters max field) 
    g.DrawLine(linePen, lineLeft, rowPosition, lineRight, rowPosition);
    g.DrawString("Description", smallBoldFont, Brushes.Black, 3, ++rowPosition);
    g.DrawString(item.Desc, smallFont, Brushes.Black, new Rectangle(startPoint, rowPosition, columnWidth, rowIncrement * 2));
    rowPosition += rowIncrement;
    rowPosition += rowIncrement;

    //Details (250 characters max)
    g.DrawLine(linePen, lineLeft, rowPosition, lineRight, rowPosition);
    g.DrawString("Detailed Desc", smallBoldFont, Brushes.Black, 3, ++rowPosition);
    g.DrawString(item.DetailedDescription, smallFont, Brushes.Black, new Rectangle(startPoint, rowPosition, columnWidth, rowIncrement * 2));
    rowPosition += rowIncrement;
    rowPosition += rowIncrement;
    rowPosition += rowIncrement;

    //Gender (M or F)
    g.DrawLine(linePen, lineLeft, rowPosition, lineRight, rowPosition);
    g.DrawString("Gender", smallBoldFont, Brushes.Black, 3, ++rowPosition);
    g.DrawString(item.Gender.ToString(), smallFont, Brushes.Black, startPoint, rowPosition);
    rowPosition += rowIncrement;
}

アイデアがわかります。それぞれの線を描いています。次にテキスト、次に行の位置をインクリメントして次の行に移動します。

したがって、上記の 3 つのフィールドがあります。それぞれに異なる最大サイズがあるため、それぞれがより大きなまたはより小さな「セル」を必要とする可能性があります。

したがって、私が本当に必要としているのは、特定のテキストが占めるスペースを見つける方法だと思います。g.MeasureString は幅を提供しますが、高さは提供しません (複数行に折り返す場合)。したがって、何行与えるべきかわかりません。

また、手動で測定することの問題は、変更を加えるたびに、すべてが揃っていることを確認するために、もう一度微調整を開始する必要があることです。

私も似たような文書を作る予定なので、ほとんど自動化できれば素晴らしいと思います。

これが理にかなっていることを願っています。

4

1 に答える 1