.NET 3.x печать из listbox - C#
Формулировка задачи:
Делала печать из listbox. Но печатает только первую строчку. Подскажите, пожалуйста, в чем ошибка?
private void напечататьToolStripMenuItem1_Click(object sender, EventArgs e)
{
if (printDialog1.ShowDialog() == DialogResult.OK)
{
printDocument1.DocumentName = Text;
//Определяем диапазон страниц для печати
stringPrintText = listBox1.Text;
StartPage = 1;
NumPages = printDialog1.PrinterSettings.MaximumPage;
PageNumber = 1;
//Вызываем встроенный метод для начала печати
printDocument1.Print();
}
}
private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
{
//Создаем экземпляр graph класса Graphics
Graphics graph = e.Graphics;
//Создаем объект font, которому устанавливаем
// шрифт элемента rtbText
Font font = listBox1.Font;
//Получаем значение межстрочного интервала - высоту шрифта Т1, 134
float HeightFont = font.GetHeight(graph);
//Создаем экземпляр stringformat класса StringFormat для определения
//дополнительных параметров форматирования текста.
StringFormat stringformat = new StringFormat();
//Создаем экземляры rectanglefFull и rectanglefText класса RectangleF для
//определния областей печати и текста. Т1, 104
RectangleF rectanglefFull, rectanglefText;
//Создаем переменные для подсчета числа символов и строк.
int NumberSymbols;
//В качестве области печати устанавливаем объект rectanglefFull
if (graph.VisibleClipBounds.X < 0) rectanglefFull = e.MarginBounds;
else
//Определяем объект rectanglefFull
rectanglefFull = new RectangleF(
//Устанавливаем координату X
e.MarginBounds.Left - (e.PageBounds.Width - graph.VisibleClipBounds.Width) / 2,
//Устанавливаем координату Y
e.MarginBounds.Top - (e.PageBounds.Height - graph.VisibleClipBounds.Height) / 2,
//Устанавливаем ширину области
e.MarginBounds.Width,
//Устанавливаем высоту области
e.MarginBounds.Height);
rectanglefText = RectangleF.Inflate(rectanglefFull, 0, -2 * HeightFont);
//Определяем число строк
int NumDisplayLines = (int)Math.Floor(rectanglefText.Height / HeightFont);
//Устанавливаем высоту области
rectanglefText.Height = NumDisplayLines * HeightFont;
stringformat.Trimming = StringTrimming.EllipsisCharacter;
stringformat.FormatFlags |= StringFormatFlags.NoWrap;
//При печати выбранных страниц переходим к первой стартовой странице
while ((PageNumber < StartPage) && (stringPrintText.Length > 0))
{
NumberSymbols = SymbolsInLines(stringPrintText, NumDisplayLines);
stringPrintText = stringPrintText.Substring(NumberSymbols);
//Увеличиваем число страниц
PageNumber++;
}
//Если длина строки stringPrintText равняется нулю (нет текста для печати),
// Останавливаем печать
if (stringPrintText.Length == 0)
{
e.Cancel = true;
return;
}
//Выводим (рисуем) текст для печати - stringPrintText, используем для этого шрифт font,
//кисть черного цвета - Brushes.Black, область печати - rectanglefText,
//передаем строку дополнительного форматирования stringformat
graph.DrawString(stringPrintText, font, Brushes.Black, rectanglefText, stringformat);
//Получаем текст для следующей страницы
NumberSymbols = SymbolsInLines(stringPrintText, NumDisplayLines);
stringPrintText = stringPrintText.Substring(NumberSymbols);
//Очищаем объект stringformat, использованный для формирования полей.
stringformat = new StringFormat();
//Добавляем вывод на каждую страницу ее номер
stringformat.Alignment = StringAlignment.Far;
graph.DrawString("Страница " + PageNumber, font, Brushes.Black, rectanglefFull, stringformat);
PageNumber++;
//Cнова проверяем, имеется ли текст для печати и номер страницы, заданной для печати
e.HasMorePages = (stringPrintText.Length > 0) && (PageNumber < StartPage + NumPages);
//Для печати из окна предварительного просмотра снова инициализируем переменные
if (!e.HasMorePages)
{
stringPrintText = listBox1.Text;
StartPage = 1;
NumPages = printDialog1.PrinterSettings.MaximumPage;
PageNumber = 1;
}
}
int SymbolsInLines(string stringPrintText, int NumLines)
{
int index = 0;
for (int i = 0; i < NumLines; i++)
{
index = 1 + stringPrintText.IndexOf('\n', index);
if (index == 0)
return stringPrintText.Length;
}
return index;
}
private void параметрыСтраницыToolStripMenuItem_Click(object sender, EventArgs e)
{
pageSetupDialog1.ShowDialog();
}Решение задачи: «.NET 3.x печать из listbox»
textual
Листинг программы
public Form1 ( ) {
// Обязательно подключиться к событиям printDocument1:
// BeginPrint и EndPrint
}
private void button1_Click ( object sender, EventArgs e ) {
// Добавление элементов
for ( int i = 0; i < 15; ++i )
listBox1.Items.Add( "Item #" + i );
}
int printed = 0;
private void printDocument1_PrintPage ( object sender, PrintPageEventArgs e ) {
var g = e.Graphics;
// max высота текста
int max_height = e.PageBounds.Height;
int height = 0; // Отпечатано по высоте
int temp; // Размер одной строки
for ( ; printed < listBox1.Items.Count; ++printed ) {
temp = TextRenderer.MeasureText( (string)listBox1.Items[printed], this.Font ).Height;
if ( height + temp + 5 > max_height )
break;
g.DrawString(
(string)listBox1.Items[printed],
this.Font,
Brushes.Black,
new Rectangle(
e.PageBounds.X,
height,
e.PageBounds.Width,
temp
)
);
height += temp + 5;
}
e.HasMorePages = printed != listBox1.Items.Count;
}
private void button2_Click ( object sender, EventArgs e ) {
// Печать
printDocument1.Print();
}
private void printDocument1_BeginPrint ( object sender, PrintEventArgs e ) {
if ( printed != 0 )
e.Cancel = true;
}
private void printDocument1_EndPrint ( object sender, PrintEventArgs e ) {
printed = 0;
}