.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;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.083 из 5
Похожие ответы