我正在尝试以表格/网格格式将一些数据打印到页面中。目前我让它工作,但一切都是手动绘制的。每个单元格的宽度和高度的硬编码值。
我想要做的是把它变成一个更通用的解决方案。创建某种包含所有数据的对象,并让它基本上呈现自己。
我遇到的问题是找到一种方法来确定每个单元格的高度,确保它足够大以容纳其中包含的数据。
我现在拥有的是这样的:
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 会给我宽度,但不是高度(如果它换成多行)。所以我不知道要给它多少行。
如此手动测量的另一个问题是,每次我进行更改时,我都必须重新开始调整以确保一切都对齐。
我将做类似的文件,所以如果大部分可以自动化就太好了。
希望这是有道理的。