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

Этот код создает массив для хранения ширины столбцов.

Источник: http://csharphelper.com/blog/2014/09/print-data-in-rows-and-columns-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector