Как распечатать ListView с большим содержимым в C#


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

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

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

PrintMultiLineData метод расширения показано в следующем коде управляет процессом печати.

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

Сначала метод получает горизонтальное разрешение экрана и использует его для расчета масштабного коэффициента для преобразования из пикселей, используемых для измерения ширины столбцов, на устройства печати. (Для получения дополнительной информации см. Мой предыдущий пост.

Затем код копирует ширину столбца элемента управления ListView в массив, добавляя дополнительную область для полей и масштабируя результат до единиц принтера.

Этот метод создает объект StringFormat для управления тем, как текст выравнивается во время печати, а затем начинает печать.

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

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

Следующий код показывает метод DrawMultiLineItems.

Метод DrawMultiLineItems рисует одну строку элементов данных. Переменная row_height отслеживает наибольшую высоту, необходимую любому элементу в строке.

Для каждого столбца в строке код использует метод MeasureString объекта Graphics, чтобы узнать, сколько текста в столбце этого столбца требуется. Если для текста требуется больше вертикального пространства, чем row_height, код обновляет row_height. Затем код рисует текст элемента в требуемом пространстве.

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

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

Это улучшает предыдущий пример, но у него все еще есть некоторые проблемы. В частности, этот метод предполагает, что все данные могут помещаться на одну страницу, чтобы он не разбивал печать на несколько страниц по вертикали или по горизонтали. Такой вид печати будет зависеть от ваших конкретных потребностей, поэтому я не буду здесь его освещать. Вам нужна такая печать, вы можете изменить этот пример или отправить мне по электронной почте, если хотите, чтобы я проконсультировался за вас.

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

Источник: http://csharphelper.com/blog/2017/06/print-a-listview-with-large-contents-in-c/

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

Add a Comment

Ваш e-mail не будет опубликован. Обязательные поля помечены *