Печать данных в строках и столбцах в C#
В этом примере показано, как вы можете печатать данные в строках и столбцах с заголовками столбцов.
В этом примере для инициализации данных используется следующий код.
// Пример данных.
private string[] Headers =
{"Name", "Street", "City", "State", "Zip"};
private string[,] Data =
{
{"Alice Archer", "1276 Ash Ave", "Ann Arbor", "MI", "12893"},
{"Bill Blaze", "26157 Beach Blvd", "Boron", "CA", "23617"},
{"Cindy Carruthers", "352 Cherry Ct", "Chicago", "IL", "35271"},
{"Dean Dent", "4526 Deerfield Dr", "Denver", "CO", "47848"},
};
Когда вы нажимаете кнопку «Предварительный просмотр» программы, следующий код вызывает метод PrintPreviewDialog
ShowDialog.
// Отображение предварительного просмотра.
private void btnPrintPreview_Click(object sender, EventArgs e)
{
ppdGrid.ShowDialog();
}
Свойство PrintPreviewDialog PrintDocument установлено в объект PrintDocument, который выполняет фактическую печать. Обработчик событий PrintPage этого объекта генерирует страницу, которую печатает программа. Этот обработчик событий, который показан в следующем коде, - это где большая часть работы происходит.
// Распечатайте страницу документа.
// Обратите внимание, что эта версия не обрабатывает несколько страниц.
private void pdocGrid_PrintPage(object sender,
System.Drawing.Printing.PrintPageEventArgs e)
{
// Используйте этот шрифт.
using (Font header_font = new Font("Times New Roman",
16, FontStyle.Bold))
{
using (Font body_font = new Font("Times New Roman", 12))
{
// Мы пропустим это много места между строками.
int line_spacing = 20;
// Посмотрим, насколько широкими должны быть столбцы.
int[] column_widths = FindColumnWidths(
e.Graphics, header_font, body_font, Headers, Data);
// Начнем с левого поля.
int x = e.MarginBounds.Left;
// Печать по столбцам.
for (int col = 0; col < Headers.Length; col++)
{
// Печать заголовка.
int y = e.MarginBounds.Top;
e.Graphics.DrawString(Headers[col],
header_font, Brushes.Blue, x, y);
y += (int)(line_spacing * 1.5);
// Распечатаем элементы в столбце.
for (int row = 0; row <=
Data.GetUpperBound(0); row++)
{
e.Graphics.DrawString(Data[row, col],
body_font, Brushes.Black, x, y);
y += line_spacing;
}
// Переместимся к следующему столбцу.
x += column_widths[col];
} // Зацикливание по столбцам
} // использование body_font
} // использование header_font
// DrawGrid (e, y)
e.HasMorePages = false;
}
Обработчик событий создает шрифты для заголовков столбцов сетки и значений. Затем он вызывает метод FindColumnWidths, чтобы увидеть, насколько широким должен быть каждый столбец для хранения его данных.
Далее код устанавливает переменную x на левое поле страницы и проходит через столбцы.
Для каждого столбца код устанавливает переменную y на верхнее поле страницы. Затем он отображает заголовок столбца и увеличивает y для перемещения по странице. Затем он перебирает данные для этого столбца, рисуя каждое значение в текущей (x, y) позиции и увеличивая y, чтобы снова перемещаться по странице.
После завершения печати значений столбца код увеличивает переменную x по ширине столбца, поэтому следующий столбец отображается справа.
В следующем коде показан метод FindColumnWidths.
// Определите, насколько широка каждая колонка.
private int[] FindColumnWidths(Graphics gr, Font header_font,
Font body_font, string[] headers, string[,] values)
{
// Убираем место для ширины.
int[] widths = new int[headers.Length];
// Найти ширину для каждого столбца.
for (int col = 0; col < widths.Length; col++)
{
// Проверьте заголовок столбца.
widths[col] = (int)gr.MeasureString(
headers[col], header_font).Width;
// Проверяем элементы.
for (int row = 0; row <= values.GetUpperBound(0); row++)
{
int value_width = (int)gr.MeasureString(
values[row, col], body_font).Width;
if (widths[col] < value_width)
widths[col] = value_width;
}
// Добавьте дополнительное пространство.
widths[col] += 20;
}
return widths;
}
Этот код создает массив для хранения ширины столбцов.
