Печать нескольких страниц в WinForms не работает - PullRequest
0 голосов
/ 19 февраля 2012

Исходя из Вопрос

, на который был дан очень быстрый ответ, я наткнулся на обновленную проблему.

Я изменил свою программу для заполнения некоторого набора данных из БД.

Я звоню Print() на printDocument, все работает, просто не хочет регистрировать мой e.HasMorePages = true;

Вот код:

   public static void printDokument()
   {
       if (result == DialogResult.OK)
       {

           DbDataPostavke = checkDB("SELECT * FROM " + tipDokumenta + "_postavke WHERE ID_" + tipDokumenta + " = " + stDokumenta);

           list = DbDataPostavke.Tables[0].AsEnumerable().ToList();                             
           printDocument.Print();
       }       
   }

   static void printDocument_PrintPage(object sender, PrintPageEventArgs e)
   {
       graphic = e.Graphics;

       e.PageSettings.PaperSize = ps;

       stranSirina = e.PageSettings.PrintableArea.Width;
       stranVisina = e.PageSettings.PrintableArea.Height;

       fontHeight = font.GetHeight();

       //this works/prints
       printDocument_PrintHeader();

       //this works/prints
       printDocument_PrintDocumentInfo();

       if (firstPage) printDocument_PrintSupplierInfo();    

       //Lines that I take from DB, amount of this lines is variable //it only prints one page, then it stops printing
       printDocument_PrintProductLines(e);

       //Sum of lines
       if(zadnjaStran) printDocument_printSum();

       //prints comment on document
       if (zadnjaStran) printDocument_PrintComment();

       //footer
       printDocument_PrintFooter();
   }

   static void printDocument_PrintProductLines(PrintPageEventArgs e)
   {
       //I print some stuff here (header, etc..) 

       String stranArtikliVrstica = String.Empty; // string for one line of data
       DataRow dataRow1 = null;
       DataRow dr = null;

       for(int i = 0; i < list.Count(); i++)
       {
           dr = list[i];
           dataRow1 = poglejBazo("SELECT ime, EM, opis FROM Sifrant WHERE ID = " + dr[2].ToString()).Tables[0].Rows[0];

           stranArtikliVrstica = String.Format("{0,-38}  {1,10}  {2,5}  {3,9:C}  {4,9:C}", dataRow1[0].ToString() + " - " + dataRow1[2].ToString(), dr[3].ToString(), dataRow1[1].ToString(), dr[4], Convert.ToInt16(dr[3]) * Convert.ToInt16(dr[4]));

           list.Remove(dr);

           graphic.DrawString(stranArtikliVrstica, font, brush, startX + offsetX, startY + offsetY);
           offsetY += (int)font.GetHeight();

           //if there is less then 35 "lines" remaining, we have enough space for printing some other stuff, otherwise, that stuff doesn't print..
           if (list.Count() < 35) zadnjaStran = true;
           else zadnjaStran = false;

           if (offsetY > stranVisina - 50)
           {
               prvaStran = false;
               stevecStrani++;
               offsetY = 0;
               e.HasMorePages = true;
               return;
           }
       }

   }

Итаккогда я пытаюсь напечатать документ с одной страницы, все работает, но если я пытаюсь напечатать документ с нескольких страниц, печатается только первая страница (Header, DocumentInfo, SupplierInfo, ProductLines (около 38 строк из 80),Нижний колонтитул), а затем больше нет страниц (я тестирую с печатью в файл PDF ..)

Что я делаю не так?

Есть ли проблема с параметром e в PrintProductLines?Как я могу сказать функции PrintProductLines, что я хочу вызвать HasMorePages на e из исходной функции?Я знаю, что могу передать его по ссылке, но в моем случае ключевое слово ref не работает: S

EDIT:

Изменение static void printDocument_PrintProductLines(ref PrintPageEventArgs e) и printDocument_PrintProductLines(ref e); приводит к ошибке:

Ошибка 2 Аргумент 1 должен быть передан с ключевым словом 'ref'
Ошибка 1 Наилучшее совпадение перегруженного метода для 'GZIG.globalClass.printDocument_PrintPostavke (ref System.Drawing.Printing.PrintPageEventArgs)' содержит недопустимые значенияаргументы

1 Ответ

2 голосов
/ 28 июля 2012

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

Эта подпрограмма принадлежит фактическому экземпляру класса, который будет использовать объект Graphics.

private const int PAD = 4;
private int m_Line, m_LinesToPrint;
private Font m_Font;
private PrintDocument m_Doc;

private void print_Click(object sender, EventArgs e) {
  using (var dlg = new PrintPreviewDialog()) {
    if (m_Doc == null) {
      throw new NullReferenceException("Create the document before trying to print it.");
    }
    dlg.Document = m_Doc;
    m_Line = 0;
    m_LinesToPrint = list.Count;
    m_Font = new Font("Courier New", 14, FontStyle.Underline, GraphicsUnit.Point);
    dlg.ShowDialog();
  }
}

private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) {
  float lineHeight = m_Font.GetHeight(e.Graphics) + PAD;
  float yLineTop = e.MarginBounds.Top;
  for ( ; m_Line < m_LinesToPrint; m_Line++) {
    if (e.MarginBounds.Bottom < (yLineTop + lineHeight)) {
      e.HasMorePages = true;
      return;
    }
    DataRow dr = list[m_Line];
    DataRow row1 = poglejBazo("SELECT ime, EM, opis FROM Sifrant WHERE ID = " + dr[2].ToString()).Tables[0].Rows[0];
    string strText = String.Format("{0,-38}  {1,10}  {2,5}  {3,9:C}  {4,9:C}", dataRow1[0].ToString() + " - " + dataRow1[2].ToString(), dr[3].ToString(), dataRow1[1].ToString(), dr[4], Convert.ToInt16(dr[3]) * Convert.ToInt16(dr[4]));
    // list.Remove(list[m_Line]) <= DO NOT DO THAT!
    e.Graphics.DrawString(strText, m_Font, Brushes.Black, new PointF(e.MarginBounds.Left, yLineTop));
    yLineTop += lineHeight;
  }
  e.HasMorePages = false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...