Печать сетки значений с чередующимися цветами строк в C#

Следующий код показывает, как программа печатает свою сетку. Полный код не слишком сложный, но он длинный, поэтому здесь он разбит на несколько методов.

// Нарисуем сетку.
private void pdocGrid_PrintPage(object sender, PrintPageEventArgs e)
{
    // Сделайте некоторые данные образца.
    string[] headers;
    object[][] values;
    MakeSampleData(out headers, out values);

    // Посмотрим, насколько широкими должны быть столбцы.
    using (Font header_font =
        new Font("Times New Roman", 18, FontStyle.Bold))
    {
        using (Font body_font =
            new Font("Times New Roman", 18, FontStyle.Regular))
        {
            int[] col_wid = FindColumnSizes(e.Graphics,
                header_font, body_font, headers, values);

            // Определите выравнивания столбцов.
            StringAlignment[] alignments =
                FindColumnAlignments(values);

            // Получить полную ширину.
            int grid_wid = 0;
            for (int i = 0; i < col_wid.Length; i++)
            {
                grid_wid += col_wid[i] + 2 * ColMargin;
            }

            // Распечатаем данные.
            Rectangle grid_bounds = new Rectangle(
                e.MarginBounds.Left, e.MarginBounds.Top,
                grid_wid, e.MarginBounds.Bottom);
            PrintGrid(grid_bounds, e.Graphics, col_wid, alignments,
                header_font, body_font, headers, values);
        }
    }
}

Этот код создает массивы для хранения заголовков сетки и данных тела. Затем он вызывает MakeSampleData для инициализации этих массивов. Этот метод прост, поэтому он не показан здесь.

Далее программа создает шрифты, используемые при рисовании заголовка и данных сетки. Он вызывает FindColumnSizes, чтобы найти необходимые размеры столбцов для отображения данных.

Затем код вызывает FindColumnAlignments, чтобы определить, как столбцы должны быть выровнены. В этом примере выравниваются int, float, double и десятичные данные справа и все остальные значения слева , Вы можете настроить этот код, если хотите. Вы также можете добавить форматирование по умолчанию (например, форматировать десятичные значения с двумя цифрами после десятичной точки).

Далее программа добавляет ширину столбцов, чтобы получить общую ширину сетки. Наконец, программа вызывает PrintGrid для рисования сетки.

В остальной части этого сообщения описываются методы, вызываемые этим обработчиком событий, для выполнения всей более сложной работы. Следующий код показывает метод FindColumnSizes и вспомогательный метод CheckColWidths, который он использует.

// Вычисление размеров столбцов.
private int[] FindColumnSizes(Graphics gr, Font header_font,
    Font body_font, string[] headers, object[][] values)
{
    int num_rows = values.Length;
    int num_cols = values[0].Length;

    // Проверяем ширину заголовка.
    int[] col_wid = new int[num_cols];
    CheckColWidths(col_wid, gr, header_font, headers);

    // Проверяем ширину данных.
    foreach (object[] row in values)
    {
        CheckColWidths(col_wid, gr, body_font, row);
    }

    // Добавление поля.
    for (int i = 0; i < num_cols; i++)
    {
        col_wid[i] += 20;
    }

    // Вернуть результат.
    return col_wid;
}

// Обновляем ширину столбцов для значений в этом массиве.
private void CheckColWidths(int[] col_wid, Graphics gr,
    Font the_font, object[] values)
{
    for (int i = 0; i < values.Length; i++)
    {
        SizeF txt_size =
            gr.MeasureString(values[i].ToString(), the_font);
        if (col_wid[i] < txt_size.Width)
            col_wid[i] = (int)txt_size.Width;
    }
}

Метод FindColumnSizes вызывает CheckColWidths для вычисления ширины столбцов для заголовков сетки. Затем он перебирает строки данных, вызывая CheckColWidths для проверки ширины для каждой строки данных. Он заканчивается добавлением поля в каждый столбец.

Метод CheckColWidths обрабатывает значения в массиве (либо массив заголовков, либо ряд данных). Для каждого значения используется MeasureString, чтобы увидеть, насколько велика величина при печати, и при необходимости обновляет соответствующую ширину столбца.

Метод FindColumnAlignments, показанный в следующем коде, строит массив значений StringAlignment, чтобы указать, как выравнивать каждый столбец. Предполагается, что каждый столбец содержит только один вид данных: int, string и т. д.

// Определите выравнивания столбцов.
private StringAlignment[] FindColumnAlignments(object[][] values)
{
    StringAlignment[] alignments =
        new StringAlignment[values.Length];
    for (int i = 0; i < values[0].Length; i++)
    {
        if (values[0][i].GetType() == typeof(int) ||
            values[0][i].GetType() == typeof(float) ||
            values[0][i].GetType() == typeof(double) ||
            values[0][i].GetType() == typeof(decimal))
        {
            alignments[i] = StringAlignment.Far;
        }
        else
        {
            alignments[i] = StringAlignment.Near;
        }
    }

    return alignments;
}

Метод FindColumnAlignments обрабатывает значения в первой строке данных, использует GetType, чтобы узнать, какой тип данных имеет каждое значение, и соответственно устанавливает выравнивание. р>

Следующий PringGrid метод генерирует распечатку.

// Печать сетки.
private void PrintGrid(Rectangle grid_bounds, Graphics gr,
    int[] col_wid, StringAlignment[] alignments,
    Font header_font, Font body_font, string[] headers,
    object[][] values)
{
    // Печать заголовков.
    int x = grid_bounds.Left;
    int y = grid_bounds.Top;

    // Заполните фон заголовка.
    Rectangle bg_rect = new Rectangle(
        x, y, grid_bounds.Width, RowMargin + HeaderMargin);
    gr.FillRectangle(Brushes.Blue, bg_rect);

    // Нарисуем текст заголовка.
    using (StringFormat string_format = new StringFormat())
    {
        for (int i = 0; i < headers.Length; i++)
        {
            RectangleF layout_rect = new
                RectangleF(x + ColMargin, y,
                    col_wid[i], RowMargin);
            string_format.Alignment = alignments[i];
            string_format.LineAlignment = StringAlignment.Near;
            gr.DrawString(headers[i],
                header_font, Brushes.White,
                layout_rect, string_format);
            x += col_wid[i] + 2 * ColMargin;
        }
    }
    bg_rect.Height -= HeaderMargin;
    y += HeaderMargin;

    // Печать значений.
    int max_x = x;
    for (int r = 0; r < values.Length; r++)
    {
        x = grid_bounds.Left;
        y += RowMargin;

        // Заполните фон строки.
        bg_rect.Y = y;
        if (r % 2 == 0)
        {
            gr.FillRectangle(Brushes.LightGreen, bg_rect);
        }
        else
        {
            gr.FillRectangle(Brushes.LightBlue, bg_rect);
        }

        using (StringFormat string_format = new StringFormat())
        {
            for (int i = 0; i < values[r].Length; i++)
            {
                // Рисуем текст.
                RectangleF layout_rect = new
                    RectangleF(x + ColMargin, y,
                        col_wid[i], RowMargin);
                string_format.Alignment = alignments[i];
                string_format.LineAlignment = StringAlignment.Near;
                gr.DrawString(values[r][i].ToString(),
                    body_font, Brushes.Black,
                    layout_rect, string_format);

                x += col_wid[i] + 2 * ColMargin;
            }
        }
        gr.DrawLine(Pens.Black, grid_bounds.X, y, max_x, y);
    }

        grid_bounds = new Rectangle(
        grid_bounds.X, grid_bounds.Y, grid_bounds.Width,
        (values.Length + 1) * RowMargin + HeaderMargin);
    gr.DrawRectangle(Pens.Black, grid_bounds);
}

Метод PrintGrid начинается с заполнения прямоугольника за областью заголовка. Затем он перебирает строки заголовков, рисуя их. Он использует массив выравниваний для надлежащего выравнивания заголовков. (Вы можете изменить это, чтобы выровнять по левому краю все заголовки, даже если их столбцы содержат числовые данные, если хотите.)

Далее код проходит через строки данных. Для каждой строки код заполняет фон строки LightGreen или LightBlue. Затем он перебирает значения строки, печатая каждый, выровненный соответствующим образом.

Источник: http://csharphelper.com/blog/2015/05/print-a-grid-of-values-with-alternating-row-colors-in-c/

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