2011-12-22 107 views
1

我試圖打印出一些數據到表格/網格格式的頁面。 目前我有它的工作,但一切都是手動繪製出來的。 每個單元的寬度和高度都相當硬編碼的值。C#PrintDocument - 表格/網格佈局問題

我想要做的是把它變成一個更通用的解決方案。創建一些包含所有數據的對象,並使其基本呈現自己。

我遇到的問題是找到一種方法來確定每個單元格的高度,確保它足夠大,以便包含在其中的數據。

我目前所面對的是什麼樣的東西:

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會給我的寬度,但不是高度(如果它包裝成多行)。所以我不知道有多少行給它。

另外一個問題是,它是如此手動測量是每次我做出改變,我必須經過並開始再次調整,以確保一切排列。

我將要做類似的文件,所以如果大多數情況下它可以被自動化,那將會很棒。

希望這是有道理的。

回答

1

是的,我知道這是舊的,但沒有理由讓它掛在沒有答案。

您需要使用GetHeightMeasureString方法。無論是一個需要你希望測量,所以使用smallFont它可以被定義(例如目的)字體

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

您可以得到由高度:

smallFont.GetHeight(g) 

交替

g.MeasureString("TestString", smallFont)