Как распечатать содержимое элемента управления ListView на нескольких страницах в C#

Когда программа печатает в .NET, объект PrintDocument вызывает обработчик события PrintPage для создания каждой страницы. Эта программа должна установить параметр e.HasMorePages обработчика события, чтобы указать, есть ли больше страниц для печати.

В этом примере отслеживается следующая строка ListView, которая должна быть напечатана. Обработчик события PrintPage начинает печать в этой строке, обновляет следующую строку при завершении печати страницы и соответственно устанавливает e.HasMorePages.

Изменения программы находятся в модуле ListViewExtensions, который добавляет методы расширения в элемент управления ListView. Модуль теперь включает следующую переменную, чтобы отслеживать следующую строку ListView для печати.

// Индекс следующей строки списка ListView.
private static int NextListViewRow = 0;

Метод pdocListView_PrintPage, который является обработчиком событий PrintPage, используемым для печати, теперь передает метод PrintMultiLineData нижний край печатной страницы, чтобы метод знал, сколько у него места для печати.

// Печать списка.
e.HasMorePages = !lvwBooks.PrintMultiLineData(
    e.MarginBounds.Location,
    e.MarginBounds.Bottom,
    e.Graphics, Brushes.Blue,
    Brushes.Black, Pens.Blue);

Метод PrintMultiLineData также возвращает true, если все данные были напечатаны. Обработчик события PrintPage использует возвращаемое значение для установки e.HasMorePages.

Метод PrintMultiLineData похож на предыдущую версию, за исключением того, что он передает нижнее поле методу DrawMultiLineItems, который фактически выполняет чертеж.

if (!DrawMultiLineItems(subitems_query.ToArray(),
    gr, lvw.Font, data_brush, grid_pen,
    max_y, x_margin, y_margin,
    x, ref y, col_wids, num_columns, string_format)) return false;
NextListViewRow++;

DrawMultiLineItems измеряет строку ListView и, если она подходит на странице, рисует ее и возвращает true. Если строка не подходит, то метод не выводит строку и возвращает false.

Если метод DrawMultiLineItems возвращает false, чтобы указать, что строка не подходит, тогда метод PrintMultiLineData также возвращает false, поэтому обработчик события PrintPage знает, что для печати больше строк.

Если DrawMultiLineItems возвращает true, то PrintMultiLineData увеличивает значение NextListViewRow, чтобы он мог распечатать следующую строку и продолжить.

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

// Измеряем размер, необходимый для текста.
for (int i = 0; i < num_columns; i++)
{
    SizeF layout_area = new SizeF(col_wids[i], 1000);
    SizeF row_size = gr.MeasureString(items[i], lvw_font,
        layout_area);
    if (row_height < row_size.Height) row_height = row_size.Height;
}

// Посмотрим, хватит ли места для строки.
if (y0 + row_height > max_y) return false;

// Рисуем текст.

Остальная часть метода печатает строку, как и раньше. Более подробную информацию см. В предыдущих примерах.

Обратите внимание, что в этом примере не обрабатывается случай, когда одна строка в ListView настолько высока, что она не может помещаться отдельно на странице. Однако это должен быть довольно необычный случай.

Источник: csharphelper.com/blog/2017/06/print-a-listview-controls-contents-on-multiple-pages-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (2 оценок, среднее: 4,50 из 5)
Adblock
detector