Печать данных в строках и столбцах в 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; }
Этот код создает массив для хранения ширины столбцов.