Member 12221464 Ответов: 2

Как напечатать несколько страниц C#


Моя программа генерирует штрих-коды , поэтому у меня есть проблема, когда дело доходит до печати следующей страницы. Предварительный просмотр не показывает следующую страницу и останавливается . Может кто-нибудь мне помочь?. У меня есть цикл for , поэтому, когда я проверяю границы страницы и устанавливаю значение hasmorepages true, предварительный просмотр не прекращает генерировать предварительные просмотры .

Что я уже пробовал:

for (int i = 0; i < second; i++)
               {
                  // MessageBox.Show(c + " c value " + p + " p value");
                   if (c < Int32.Parse(textBoxY.Text)) {

                       for (o = 0; o < first; o++)
                       {
                           {

                               if (textBoxX.Text == "1" & comboBox3.SelectedIndex != 4) { h += placing1_h(); }//1
                               else if (textBoxX.Text == "1" & comboBox3.SelectedIndex == 4) { h += placing1_h(); }//1

                               if (comboBox3.SelectedIndex == 3 & textBoxX.Text == "2") { h += 40; }
                               if (comboBox3.SelectedIndex == 4 & textBoxX.Text == "2") { h += 30; }
                               if (comboBox3.SelectedIndex == 2 & textBoxX.Text == "2") { h += 60; }
                               if (comboBox3.SelectedIndex == 0 & textBoxX.Text == "2") { h += 80; }
                               if (comboBox3.SelectedIndex == 1 & textBoxX.Text == "2") { h += 60; }
                               if (comboBox3.SelectedIndex == 1 & textBoxX.Text == "3") { h += 20; }
                               if (comboBox1.SelectedIndex == 3 && textBoxX.Text == "3" && comboBox3.SelectedIndex == 1) { h -= 5; }
                               if (comboBox3.SelectedIndex == 0 & textBoxX.Text == "3") { h += 20; }
                               if (comboBox3.SelectedIndex == 0 & textBoxX.Text == "5") { h+=5; }
                               e.HasMorePages = true;

                           e.Graphics.DrawString(textBoxResult.Lines[c].ToString(), font, Brushes.Black, new Point(h + mikos, p));
                           ///MessageBox.Show(p+" --- ");
                           if (e.HasMorePages = p > e.PageBounds.Bottom)
                           {
                               e.HasMorePages = true;
                               break;
                           }

                           if ((comboBox3.SelectedIndex == 2 & textBoxX.Text == "3")) { h += placing3_h(); }//2
                               if ((comboBox3.SelectedIndex == 2 & textBoxX.Text == "4")) { h += placing4_h(); }//2
                               if ((comboBox3.SelectedIndex == 2 & textBoxX.Text == "2")) { h += placing2_h(); }//2

                               if (comboBox3.SelectedIndex == 3 & textBoxX.Text == "3") { h += placing3_h(); }//3
                               if (comboBox3.SelectedIndex == 3 & textBoxX.Text == "2") { h += placing2_h(); }//γινεται υπερκαλυψη δεν μπορει να χωρεσει αλλο

                               if (comboBox3.SelectedIndex == 0 & textBoxX.Text == "2") { h += placing2_h(); }//0
                               if (comboBox3.SelectedIndex == 0 & textBoxX.Text == "3") { h += placing3_h(); }//0
                               if (comboBox3.SelectedIndex == 0 & textBoxX.Text == "4") { h += placing4_h(); }//0
                               if (comboBox3.SelectedIndex == 0 & textBoxX.Text == "5") { h += 160; }//0

                               if (comboBox3.SelectedIndex == 4 & textBoxX.Text == "2") { h += placing2_h(); }//4
                               if (comboBox3.SelectedIndex == 4 & textBoxX.Text == "3") { h += placing3_h(); }//4

                               if (comboBox3.SelectedIndex == 1 & textBoxX.Text == "2") { h += placing2_h(); }
                               if (comboBox3.SelectedIndex == 1 & textBoxX.Text == "4") { h += placing4_h(); }
                               if (comboBox3.SelectedIndex == 1 & textBoxX.Text == "3") { h += placing3_h(); }//1
                               c++;
                       }
                   }

                   }
                   if (comboBox3.SelectedIndex == 0 & textBoxX.Text == "5") { h = 10; }
                   else
                   {
                       h = 20;
                   }
                   p += 100 + height;

                   e.HasMorePages = false;
               }


private void preview(PrintDocument doc)
        {
            try
            {
                PrintPreviewDialog printDialog = new PrintPreviewDialog();
                printDialog.Document = doc;
                printPreviewDialog1.PrintPreviewControl.StartPage = 1;
                printPreviewDialog1.PrintPreviewControl.Columns = 3;
               // doc.EndPrint += doc_EndPrint; // Subscribe to EndPrint event of your document here.
                printDialog.ShowDialog();

            }
            catch (System.ArgumentException ex) { }
        }

Maciej Los

Я бы изменился
if (e.HasMorePages = p > e.PageBounds.Bottom)
{
e.HasMorePages = true;
break;
}

с:
if (p > e.MarginBounds.Bottom)
e.HasMorePages = true;

Member 12221464

По-прежнему никаких результатов ... Вы хотите отправить вам проект ?

Maciej Los

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

Member 12221464

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

это код из метода, который отправляет информацию для предварительного просмотра
док.В Команде Printpage += Doc_PrintPage2;

др.AllowSelection = истина;
др.AllowSomePages = истина;
др.Документ = док;
предварительный просмотр(doc);

Это оператор if, который я поместил внутри цикла for после e.Graphics.шнурок
if (p < e.MarginBounds.Дно)

{
e.HasMorePages = false;
i += 1;
}
еще
{
i = 0;
е.HasMorePages = истина;
вернуть;
}

Maciej Los

Проверьте свою логику:

if (p < e.MarginBounds.Bottom)

{
e.HasMorePages = false;
i += 1;
}
else

Что касается меня, то так и должно быть:

if (p > e.MarginBounds.Bottom)

{
e.HasMorePages = true;
i += 1;
}
else

2 Ответов

Рейтинг:
12

Maciej Los

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

Самое главное, что вы должны определить количество элементов на странице. В случае, когда количество элементов на странице достигнет желаемого значения, вы должны сбросить эту переменную, установить e.HasMorePage к true и использовать return ключевое слово для повторного вызова события печати страницы. Видеть:

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
     {
          float  currentY = 10;// declare  one variable for height measurement
          e.Graphics.DrawString("Print in Multiple Pages", DefaultFont, Brushes.Black, 10, currentY);//this will print one heading/title in every page of the document
          currentY += 15;

         while(totalnumber <= 50) // check the number of items
          {
          e.Graphics.DrawString(totalnumber.ToString(),DefaultFont, Brushes.Black, 50,currentY);//print each item
          currentY += 20; // set a gap between every item
          totalnumber += 1; //increment count by 1
          if(itemperpage < 20) // check whether  the number of item(per page) is more than 20 or not
           {
             itemperpage += 1; // increment itemperpage by 1
             e.HasMorePages = false; // set the HasMorePages property to false , so that no other page will not be added

            }

           else // if the number of item(per page) is more than 20 then add one page
            {
             itemperpage = 0; //initiate itemperpage to 0 .
             e.HasMorePages = true; //e.HasMorePages raised the PrintPage event once per page .

             //!!!HERE!!!
             return;//It will call PrintPage event again

             }
          }
     }


Рейтинг:
10

Member 12221464

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

doc.PrintPage += new PrintPageEventHandler (this.Doc_PrintPage);                   
                    doc.PrintPage += delegate (object sender1, System.Drawing.Printing.PrintPageEventArgs e1)
                {
                    float size = (float)0;
                    int charsFitted, linesFilled;
                    Font f = null ;
                    try
                    {
                        if (textBoxX.Text == "1")
                        {
                            size = 64;
                        }
                        else if (textBoxX.Text == "2")
                        {
                            size = 33;
                        }
                        else if (textBoxX.Text == "3")
                        {
                            size = 22;
                        }
                        else if (textBoxX.Text == "4")
                        {
                            size =(float) 15.8;
                        }
                        else if (textBoxX.Text == "5")
                        {
                            size =(float) 13.2;
                        }
                        f = new Font("Arial", size);
                    }
                    catch (System.ArgumentException ep) { }                   
                        var realsize = e1.Graphics.MeasureString(
                        textBoxResult.Text,
                        f,
                        e1.MarginBounds.Size, 
                        System.Drawing.StringFormat.GenericDefault,
                        out charsFitted,  
                        out linesFilled);

                var fitsOnPage =  textBoxResult.Text.Substring(0, charsFitted);
                textBoxResult.Text = textBoxResult.Text.Substring(charsFitted).Trim().ToString();

                e1.Graphics.DrawString(
                        fitsOnPage,
                        f,
                        Brushes.Transparent,
                        e1.MarginBounds); 
                    e1.HasMorePages = textBoxResult.Text.Length >1;
                
                };                             


Richard MacCutchan

catch (System.ArgumentException ep) { }

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

Maciej Los

Вы должны сказать "спасибо", принимая ценные ответы и используя систему голосования (звезды в правом верхнем углу решения: 1 и 2-нисходящий голос, 3-нейтральный, 4 и 5 - восходящий голос).
+5 за ваши усилия.