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

1

是的,我知道这是旧的,但这没有理由让它在没有答案的情况下徘徊。

您需要使用GetHeightMeasureString方法。任何一个都需要您要测量的字体,因此请在可以定义的地方使用您的smallFont (例如目的)

smallFont = New Font("Arial", 8, FontStyle.Regular)

您可以通过以下方式获得高度:

smallFont.GetHeight(g)

交替

g.MeasureString("TestString", smallFont)
于 2017-09-20T17:13:10.733 回答