2011-12-22 2 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

Да, я знаю, что это старо, но это не повод для того, чтобы он болтался без ответа.

Вы нужно использовать GetHeight или MeasureString метод. Либо один требует шрифт, который вы хотите измерить, поэтому с помощью smallFont, где она может быть определена (для примера)

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

Вы можете получить высоту по:

smallFont.GetHeight(g) 

попеременно

g.MeasureString("TestString", smallFont) 
Смежные вопросы