Я пытаюсь распечатать некоторые данные на странице в формате таблицы/сетки. На данный момент у меня есть работа, но все вытягивается вручную. Довольно жестко закодированные значения для ширины и высоты каждой ячейки.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 даст мне ширину, но не высоту (если она обтекает несколько строк). Поэтому я не знаю, сколько строк это даст.
Также проблема с тем, что она измеряется вручную, каждый раз, когда я делаю изменения, мне нужно пройти и снова начать настройку, чтобы убедиться, что все выстроено вверх.
Я собираюсь делать подобные документы, поэтому было бы здорово, если бы в основном это могло быть автоматизировано.
Надеюсь, что это имеет смысл.