c# PrintDocument -表格/网格布局问题

本文关键字:网格 布局 问题 表格 PrintDocument | 更新日期: 2023-09-27 18:18:31

我试图打印出一些数据到一个表格/网格格式的页面。目前我有它的工作,但一切都是手动抽出。每个单元格的宽度和高度相当硬编码的值。

我想做的是把它变成一个更通用的解决方案。创建包含所有数据的某种对象,并让它基本上呈现自己。

我遇到的问题是找到一种方法来确定每个单元格的高度,确保它足够大,可以容纳其中的数据。

我现在有的是这样的:

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将给我宽度,但不是高度(如果它缠绕到多行)。所以我不知道给它多少行

手动测量的另一个问题是,每次我做出改变时,我都必须从头开始调整,以确保一切都对齐。

我也要做类似的文档,所以如果大部分都能自动化就太好了。

c# PrintDocument -表格/网格布局问题

是的,我知道这是旧的,但这不是没有答案就挂在那里的理由。

需要使用GetHeightMeasureString方法。两者都需要您希望测量的字体,因此使用smallFont可以定义的地方(例如目的)

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

你可以通过:

smallFont.GetHeight(g)
交替

g.MeasureString("TestString", smallFont)