0

我有一个reportviewer 并启用了打印按钮但未启用工具栏。当用户按下输入reportviewer 时应该开始打印。它甚至不应该显示printdialog。我应该在KeyPres 事件中编写什么代码?

4

3 回答 3

0

我想从 ReportViewer 以编程方式打印时,这对我有用。

您需要将 PrintController 设置为 StandardPrintController 以抑制打印对话框,例如

printDoc.PrintController = new System.Drawing.Printing.StandardPrintController();
于 2009-07-27T04:06:06.303 回答
0

这是我在报告查看器中手动打印的代码。虽然它在 VB.NET 中。它通过处理 PrintDocument 对象的打印事件来工作。

  Dim m_pageSettings As PageSettings          'Stores page settings for printout
  Dim m_currentPage As Integer                'Used for index of pages
  Private m_pages As New List(Of Stream)()    'Stores a stream for each pages

  'Event fires when printDocument starts printing - reset page index to zero
  Private Sub PrintDocument1_BeginPrint(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles PrintDocument1.BeginPrint
    m_currentPage = 0
  End Sub

  'Function that prints all the pages included in the report
  Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    Dim pageToPrint As Stream = m_pages(m_currentPage)
    pageToPrint.Position = 0

    Dim pageMetaFile As Metafile = New Metafile(pageToPrint)      'create an image(metafile) of the report page
    Using (pageMetaFile)
      'Create a rectangle the size of our report - include margins
      ' Dim adjustedRect As Rectangle = New Rectangle( _
      '    e.PageBounds.Left - CType(e.PageSettings.HardMarginX, Integer), _
      '    e.PageBounds.Top - CType(e.PageSettings.HardMarginY, Integer), _
      '    e.PageBounds.Width, _
      '    e.PageBounds.Height)

      Dim adjustedRect As Rectangle = New Rectangle( _
    e.PageBounds.Left, _
    e.PageBounds.Top, _
    e.PageBounds.Width, _
    e.PageBounds.Height)

      e.Graphics.FillRectangle(Brushes.White, adjustedRect)   'Fill rectangle with WHITE background
      e.Graphics.DrawImage(pageMetaFile, adjustedRect)        'Draw report in rectangle - this will be printed
      m_currentPage = m_currentPage + 1
      e.HasMorePages = m_currentPage < m_pages.Count          'If more pages are left - keep processing
    End Using
  End Sub

  'Event fires when PrintDocument queries for PageSettings.  Return a copy of m_pagesettings.
  Private Sub PrintDocument1_QueryPageSettings(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.QueryPageSettingsEventArgs) Handles PrintDocument1.QueryPageSettings
    e.PageSettings = CType(m_pageSettings.Clone, PageSettings)
  End Sub

  'Render the report in a EMF - This function creates metafiles(images) of each page in the report
  Private Sub RenderAllLocalReportPages(ByVal localReport As LocalReport)
    Dim deviceInfo As String = CreateEMFDeviceInfo()    'Enhanced MetaFile
    Dim warnings As Warning() = Nothing
    localReport.Render("IMAGE", deviceInfo, AddressOf LocalReportCreateStreamCallback, warnings)
  End Sub

  'Callback function used with RenderAllLocalReportPages
  Private Function LocalReportCreateStreamCallback(ByVal name As String, ByVal extension As String, ByVal encoding As Encoding, ByVal mimeType As String, ByVal willSeek As Boolean) As Stream
    Dim stream As New MemoryStream()
    m_pages.Add(stream)
    Return stream
  End Function

  Private Function CreateEMFDeviceInfo() As String
    Dim paperSize As PaperSize = m_pageSettings.PaperSize
    Dim margins As Margins = m_pageSettings.Margins

    'The device info string defines the page range to print as well as the size of the page.
    'A start and end page of 0 means generate all pages.
    Return String.Format(CultureInfo.InvariantCulture, "<DeviceInfo><OutputFormat>emf</OutputFormat><StartPage>0</StartPage><EndPage>0</EndPage><MarginTop>{0}</MarginTop><MarginLeft>{1}</MarginLeft><MarginRight>{2}</MarginRight><MarginBottom>{3}</MarginBottom><PageHeight>{4}</PageHeight><PageWidth>{5}</PageWidth></DeviceInfo>", ToInches(margins.Top), ToInches(margins.Left), ToInches(margins.Right), ToInches(margins.Bottom), ToInches(paperSize.Height), ToInches(paperSize.Width))
  End Function

  'Convert report printing size to inches
  Private Shared Function ToInches(ByVal hundrethsOfInch As Integer) As String
    Dim inches As Double = hundrethsOfInch / 100.0R
    Return inches.ToString(CultureInfo.InvariantCulture) & "in"
  End Function
于 2009-07-27T18:25:43.593 回答
0

我正在为我的项目使用自定义报告。自定义是指使用 e.Graphics.DrawString 类型代码构建的报告。

所以我在默认打印事件中制作了所有报告(编码)PrintDocument

这是 PrintDocument 工具的。将其拖放到屏幕上,然后双击它以创建事件处理程序。

事件处理程序背后的代码PrintDocoument是:

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
    {
       Image image = Properties.Resources.New_Header;
       Font font = new Font("Arial", 7, FontStyle.Bold);
        Font font2  = new Font("Arial", 7, FontStyle.Regular);
        float fontHeight = font2.GetHeight();
        e.Graphics.DrawImage(image, 20, 5, 260, 130);
        e.Graphics.DrawString("Date:" + DateTime.Now.ToShortDateString(), new Font("Arial", 7, FontStyle.Bold), Brushes.Black, new Point(20, 160));
        e.Graphics.DrawString("Invoice#:  "+InvoiceNoTextBox.Text, new Font("Arial", 7, FontStyle.Bold), Brushes.Black, new Point(160, 160));
        e.Graphics.DrawString("Client Name:  " + ClientNameTextBox.Text.Trim(), new Font("Arial", 7, FontStyle.Bold), Brushes.Black, new Point(20, 180));
        e.Graphics.DrawString("______________________________",
            new Font("Arial", 12, FontStyle.Regular), Brushes.Black, new Point(20, 190));
        e.Graphics.DrawString("Product", new Font("Arial", 7, FontStyle.Bold), Brushes.Black, new Point(23, 220));
        e.Graphics.DrawString("U/Price", new Font("Arial", 7, FontStyle.Bold), Brushes.Black, new Point(170, 220));
        e.Graphics.DrawString("Qty", new Font("Arial", 7, FontStyle.Bold), Brushes.Black, new Point(210, 220));
        e.Graphics.DrawString("Total", new Font("Arial", 7, FontStyle.Bold), Brushes.Black, new Point(240, 220));
        e.Graphics.DrawString("______________________________",
           new Font("Arial", 12, FontStyle.Regular), Brushes.Black, new Point(20, 220));

        int CurrentX = 25;
        int CurrentY = 230;
        int offset = 20;
        foreach (var i in shoppingCart)
        {
            e.Graphics.DrawString(i.ItemName, new Font("Arial", 7, FontStyle.Regular), Brushes.Black, new Point(CurrentX, CurrentY+offset));
            e.Graphics.DrawString(i.UnitPrice.ToString(), new Font("Arial", 7, FontStyle.Regular), Brushes.Black, new Point(180, CurrentY + offset));
            e.Graphics.DrawString(i.Quantity.ToString(), new Font("Arial", 7, FontStyle.Regular), Brushes.Black, new Point(215, CurrentY + offset));
            e.Graphics.DrawString(i.TotalPrice.ToString(), new Font("Arial", 7, FontStyle.Regular), Brushes.Black, new Point(240, CurrentY + offset));
            offset = offset + (int)fontHeight + 5;

        }
        CurrentY = CurrentY+offset;
        e.Graphics.DrawString("______________________________",
          new Font("Arial", 12, FontStyle.Regular), Brushes.Black, new Point(20, CurrentY-5));
        e.Graphics.DrawString("Total Amt: Rs." + TotalAmountTextBox.Text, new Font("Arial", 7, FontStyle.Regular), Brushes.Black, new Point(180, CurrentY + 35));
        e.Graphics.DrawString("Discount%:  " + DiscountTextBox.Text.Trim()+"%", new Font("Arial", 7, FontStyle.Regular), Brushes.Black, new Point(180, CurrentY + 50));
        e.Graphics.DrawString("Discount: Rs." + JustDiscountTextBox.Text.Trim(), new Font("Arial", 7, FontStyle.Regular), Brushes.Black, new Point(180, CurrentY + 65));
        e.Graphics.DrawString("Grand Total: Rs." + TotalToPayTextBox.Text, new Font("Arial", 7, FontStyle.Regular), Brushes.Black, new Point(180, CurrentY + 80));
        e.Graphics.DrawString("Advance: Rs." + AdvancePaymentTextBox.Text.Trim(), new Font("Arial", 7, FontStyle.Regular), Brushes.Black, new Point(20, CurrentY + 95));
        e.Graphics.DrawString("Cash: Rs." + givenCash.Text.Trim(), new Font("Arial", 7, FontStyle.Regular), Brushes.Black, new Point(180, CurrentY + 95));
        e.Graphics.DrawString("Pending: Rs." + PendingPaymentTextBox.Text, new Font("Arial", 7, FontStyle.Regular), Brushes.Black, new Point(20, CurrentY + 110));
        e.Graphics.DrawString("Return: Rs." + ReturnTextBox.Text, new Font("Arial", 7, FontStyle.Regular), Brushes.Black, new Point(180, CurrentY + 110));
        e.Graphics.DrawString("Software Provided By Muhammad Abbas", new Font("Arial", 7, FontStyle.Regular), Brushes.Black, new Point(20, CurrentY + 125));
        e.Graphics.DrawString("Mob:0304-9550308", new Font("Arial", 7, FontStyle.Regular), Brushes.Black, new Point(20, CurrentY + 140));

    }

    private void PrintPreviewButton_Click(object sender, EventArgs e)
    {
        try
        {
            printPreviewDialog1.Document = printDocument1;
            printPreviewDialog1.ShowDialog();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

    }

最后是你问题的答案。在您的 FormKeyDown事件中使用它。

    private void Form_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            printDocument1.Print();
        }
    }

它将直接从您的打印机打印您的收据。

于 2016-07-07T04:58:08.150 回答