.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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д