テーブル/グリッド形式でページにデータを印刷しようとしています。現時点では動作していますが、すべて手動で描画されます。各セルの幅と高さのかなりハードコードされた値。
私がやろうとしているのは、それをより一般的なソリューションに変えることです。すべてのデータを含むある種のオブジェクトを作成し、基本的にそれ自体をレンダリングします。
私が抱えている問題は、各セルの高さを決定する方法を見つけて、そこに含まれるデータに対して十分な大きさであることを確認することです。
私が現時点で持っているものは次のようなものです:
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 は幅を提供しますが、高さは提供しません (複数行に折り返す場合)。したがって、何行与えるべきかわかりません。
また、手動で測定することの問題は、変更を加えるたびに、すべてが揃っていることを確認するために、もう一度微調整を開始する必要があることです。
私も似たような文書を作る予定なので、ほとんど自動化できれば素晴らしいと思います。
これが理にかなっていることを願っています。