2015-04-17 6 views
1

У меня есть следующий метод в C#:Pass PaintEventArgs в метод

private string adjustColumnValueLength(String value, int maxLength, PaintEventArgs e) 
{ 
    // Set up our string font 
    System.Drawing.Font printFontText = new System.Drawing.Font("Arial", 12, System.Drawing.FontStyle.Regular);    
    SizeF stringSize = new SizeF(); 
    string newValue = value; 

    // Loop until the string fits the size we need 
    for (int x = value.Length; x >= 0; x--) 
    { 
     // Measure the string 
     newValue = value.Substring(0, x); 
     stringSize = e.Graphics.MeasureString(newValue, printFontText); 
     Size roundedSize = Size.Round(stringSize); 
     if (Int32.Parse(roundedSize.ToString()) <= maxLength) 
     { 
      return newValue; 
     } 
    } 
    return newValue; 
} 

Я называю это из другого метода, чтобы получить длину строки, чтобы соответствовать ширине в пикселях, я должен показать это, однако У меня нет идеи, как я должен пройти в PaintEventArgs. Я пробовал использовать System.Windows.Forms.PaintEventArgs, но это не работает.

Как это можно сделать?

UPDATE

private void btnPrintTicket_Click(object sender, EventArgs e) 
    { 
     // Loop over items in the listScanData object and create a ticket for printing showing 
     // the Job #, In/Out, Part #, Name, Description and Qty 
     line = 0; 
     page = 1; 
     xCoord = 50; 
     yCoord = 180; 
     printTicket = new System.Drawing.Printing.PrintDocument(); 
     printTicket.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.ticketData); 
     PrintDialog printDialog = new PrintDialog(); 
     printDialog.Document = printTicket; 
     DialogResult result = printDialog.ShowDialog(); 
     if (result == DialogResult.OK) 
     { 
      printTicket.Print(); 
     } 
    } 

    private void ticketData(object sender, System.Drawing.Printing.PrintPageEventArgs e) 
    { 
     // Insert code here to render the content we want to print 
     System.Drawing.Font printFontHeading = new System.Drawing.Font("Arial", 18, System.Drawing.FontStyle.Regular); 
     System.Drawing.Font printFontSubheading = new System.Drawing.Font("Arial", 16, System.Drawing.FontStyle.Regular); 
     System.Drawing.Font printFontFooter = new System.Drawing.Font("Arial", 12, System.Drawing.FontStyle.Italic); 
     System.Drawing.Font printFontLabels = new System.Drawing.Font("Arial", 14, System.Drawing.FontStyle.Underline); 
     System.Drawing.Font printFontText = new System.Drawing.Font("Arial", 12, System.Drawing.FontStyle.Regular); 

     // Draw our heading and subheading 
     string printHeader = "Header 1";    
     string printSubHeader = "Subheader"; 
     e.Graphics.DrawString(printHeader, printFontHeading, System.Drawing.Brushes.Black, 50, 50); 
     e.Graphics.DrawString(printSubHeader, printFontSubheading, System.Drawing.Brushes.Black, 50, 80); 
     Pen pen = new Pen(Color.Gray); 
     e.Graphics.DrawLine(pen, new Point(50, 110), new Point(800, 110));    

     // Draw our table headers 
     string thType = "Type:"; string thName = "Name:"; string thNo = "No:"; string thQty = "Qty:"; string thBackorderQty = "Backorder Qty:"; 
     e.Graphics.DrawString(thType, printFontLabels, System.Drawing.Brushes.Black, 50, 150);    
     e.Graphics.DrawString(thName, printFontLabels, System.Drawing.Brushes.Black, 200, 150); 
     e.Graphics.DrawString(thNo, printFontLabels, System.Drawing.Brushes.Black, 400, 150); 
     e.Graphics.DrawString(thQty, printFontLabels, System.Drawing.Brushes.Black, 550, 150); 
     e.Graphics.DrawString(thBackorderQty, printFontLabels, System.Drawing.Brushes.Black, 650, 150); 

     int counter = 0; 

     // Loop over our data to print it - incrementing our yCoord var by 30 each iteration (so the text doesn't overlap) 
     for (; line < myGlobals.summaryData.Count; line++) 
     { 
      // If our line var is greater than the data count, we have no more pages to print 
      if (counter > 26) 
      { 
       // Draw our footer on the page 
       xCoord = 350; 
       yCoord = 1010;      
       e.Graphics.DrawString("Page " + page, printFontFooter, System.Drawing.Brushes.Black, xCoord, yCoord); 
       page++; 

       // Reset our counter and our x/y coord 
       counter = 0; 
       xCoord = 50; 
       yCoord = 180;      

       // Indicate we have more to print and return 
       e.HasMorePages = true; 
       return;  
      } 

      // Assign local vars with the data we need for this iteration 
      string tdScanType = myGlobals.summaryData[line].ScanType.ToString(); 
      string tdScanName = myGlobals.getProductName(myGlobals.summaryData[line].Barcode.ToString()); 
      //if (tdScanName.Length > 25) { tdScanName = tdScanName.Substring(0, 25); } 
      tdScanName = adjustColumnValueLength(tdScanName, 200); 
      string tdScanPartNo = myGlobals.getProductNumber(myGlobals.summaryData[line].Barcode.ToString()); 
      //if (tdScanPartNo.Length > 15) { tdScanPartNo = tdScanPartNo.Substring(0, 15); } 
      tdScanPartNo = adjustColumnValueLength(tdScanPartNo, 150); 
      string tdScanQty = myGlobals.summaryData[line].Qty.ToString(); 
      string tdScanBackorderQty = myGlobals.summaryData[line].BackorderQty.ToString(); 

      // Draw the scan type 
      e.Graphics.DrawString(tdScanType, printFontText, System.Drawing.Brushes.Black, xCoord, yCoord); 

      // Increment our xCoord 
      xCoord += 150; 

      // Draw the scan name 
      e.Graphics.DrawString(tdScanName, printFontText, System.Drawing.Brushes.Black, xCoord, yCoord); 

      // Increment our xCoord 
      xCoord += 200; 

      // Draw the scan part no 
      e.Graphics.DrawString(tdScanPartNo, printFontText, System.Drawing.Brushes.Black, xCoord, yCoord);     

      // Increment our xCoord 
      xCoord += 150; 

      // Draw the scan qty 
      e.Graphics.DrawString(tdScanQty, printFontText, System.Drawing.Brushes.Black, xCoord, yCoord); 

      // Increment our xCoord 
      xCoord += 100; 

      // Draw the scan backorder qty 
      e.Graphics.DrawString(tdScanBackorderQty, printFontText, System.Drawing.Brushes.Black, xCoord, yCoord); 

      // Reset our xCoord and increment our yCoord 
      xCoord = 50; 
      yCoord += 30;    

      // Increment our counter 
      counter++; 
     } 

     // Draw our footer on the page 
     xCoord = 350; 
     yCoord = 1010; 
     e.Graphics.DrawString("Page " + page, printFontFooter, System.Drawing.Brushes.Black, xCoord, yCoord); 
     e.HasMorePages = false;    
    } 

    private string adjustColumnValueLength(String value, int maxLength) 
    { 
     // Set up our string font 
     System.Drawing.Font printFontText = new System.Drawing.Font("Arial", 12, System.Drawing.FontStyle.Regular); 
     Graphics g = this.CreateGraphics(); 
     SizeF stringSize = new SizeF(); 
     string newValue = value; 

     // Loop until the string fits the size we need 
     for (int x = value.Length; x >= 0; x--) 
     { 
      // Measure the string 
      newValue = value.Substring(0, x); 
      //stringSize = TextRenderer.MeasureText(newValue, printFontText);     
      stringSize = g.MeasureString(newValue, printFontText); 
      Size roundedSize = Size.Round(stringSize); 
      if (Int32.Parse(roundedSize.ToString()) <= maxLength) 
      { 
       return newValue; 
      } 
     } 
     return newValue; 
    } 

Полный код, предоставленный выше, я пытаюсь вызвать adjustColumnValueLength внутри метода ticketData так, что я могу подстроки значение, которое печатается только по ширине у меня имеется для этой колонки.

+1

Вам не нужно 'e', просто' e.Graphics'. Узнайте, какой тип это и как вы его создаете. –

+0

Уточнить, как/где/почему вы это называете. –

+0

После редактирования: у вас есть 2 разных 'e' s, но 'e.Graphic' совместимы. –

ответ

2

Этот метод следует вызывать только из обработчика события Paint. Я предполагаю, что у вас есть что-то в вашем коде, как: (! И нигде больше)

private void Control_Paint(object sender, PainEventArgs e) { ... } 

Вы должны назвать свой метод оттуда:

private void Control_Paint(object sender, PainEventArgs e) 
{ 
    adjustColumnValueLength("value", 10, e); 
} 

Если у вас нет этого, создайте обработчик события :

this.Control.Paint += Control_Paint; 

Также читайте: Custom Control Painting and Rendering.

+0

Я пытаюсь вызвать это из метода, который имеет конструктор, который выглядит как этот private void ticketData (отправитель объекта, System.Drawing.Printing.PrintPageEventArgs e) – Phil

+0

Затем просто перейдите в 'PrintPageEventArgs.Graphics' в метод вместо' PaintEventArgs'. –

+0

Он должен __not__ вызывать это из обработчика событий Paint или из OnPaint. –

Смежные вопросы