Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
?
Solved

How to Pass DataTable Content to a StreamReader?

Posted on 2011-09-07
3
Medium Priority
?
439 Views
Last Modified: 2012-05-12
I need to print a report directly from a DataTable to stream to a printer. What I am missing is how to get the table's content into a stream to send to the printer and print each row on a new line.

            Dim da As New SqlServerCe.SqlCeDataAdapter(strQuery, gc_ConnString)
            Dim TableReport As New DataTable

            da.Fill(TableReport)
            strReport = TableReport.Rows.ToString()
            streamToPrint = New StreamReader(<table content>)

Thank you for any advice or solution.
Imports System
Imports System.IO
Imports System.Drawing
Imports System.Drawing.Printing

Public Class WriteReport
    Dim clsErrLog As New ErrorLog
    Private components As System.ComponentModel.Container
    Private printFont As Font
    Private streamToPrint As StreamReader
    Dim strReport As String

    Public Sub Print(ByRef strQuery As String)
        Try
            Dim da As New SqlServerCe.SqlCeDataAdapter(strQuery, gc_ConnString)
            Dim TableReport As New DataTable

            da.Fill(TableReport)
            strReport = TableReport.Rows.ToString()
            streamToPrint = New StreamReader(<datatable content>)  <<

            Try
                printFont = New Font("Arial", 10)
            Dim pd As New PrintDocument()
            AddHandler pd.PrintPage, AddressOf Me.pd_PrintPage
            pd.Print()
        Finally
            streamToPrint.Close()
        End Try
        Catch ex As Exception
            clsErrLog.LogError(ex.Message, "WriteReport.Print")
        End Try
    End Sub

    Private Sub pd_PrintPage(ByVal sender As Object, ByVal ev As PrintPageEventArgs)
        Dim linesPerPage As Single = 0
        Dim yPos As Single = 0
        Dim count As Integer = 0
        Dim leftMargin As Single = ev.MarginBounds.Left
        Dim topMargin As Single = ev.MarginBounds.Top
        Dim line As String = Nothing

        linesPerPage = ev.MarginBounds.Height / printFont.GetHeight(ev.Graphics)

        While count < linesPerPage
            line = streamToPrint.ReadLine()
            If line Is Nothing Then
                Exit While
            End If
            yPos = topMargin + count * printFont.GetHeight(ev.Graphics)
            ev.Graphics.DrawString(line, printFont, Brushes.Black, leftMargin, yPos, New StringFormat())
            count += 1
        End While

        If (line IsNot Nothing) Then
            ev.HasMorePages = True
        Else
            ev.HasMorePages = False
        End If
    End Sub
End Class

Open in new window

0
Comment
Question by:bobcann
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
3 Comments
 
LVL 75

Accepted Solution

by:
käµfm³d   👽 earned 1000 total points
ID: 36499130
The StreamReader constructor expects either a filename or an existing Stream object where the data will be written. If you want to dump out your DataTable, then you'll need to loop over the rows and use the WriteLine method (or one of the other Write methods) to output the data.
0
 
LVL 83

Assisted Solution

by:CodeCruiser
CodeCruiser earned 1000 total points
ID: 36499152
You dont have to use stream. You can merge datatable column values into the line object. For example

For i As integer = 0 to dTable.Rows.Count - 1
   msgbox dTable.Rows(i).Item(0) & ", " & dTable.Rows(i).Item(1)...
Next

To print to next line, you have to increment the y position in the DrawString method.

Example

http://www.codeproject.com/KB/printing/datagridprinter.aspx
0
 

Author Comment

by:bobcann
ID: 36505632
Thanks guys. This was a huge help.

All I need to do is:
Dim daReport As New SqlServerCe.SqlCeDataAdapter(strQuery, gc_ConnString)
    daReport.Fill(dtReport)
    drReport = dtReport.Rows

    For Each drRow As DataRow In drReport
	line = Pad(drRow.Item("WONUMBER").ToString, " ", 30, ppPaddingPlacement.ppTrailing)
        line = line + Pad(drRow.Item("WOADDRESS").ToString, " ", 30, ppPaddingPlacement.ppTrailing)
        line = line + Pad(drRow.Item("DESCRIPTION").ToString, " ", 46, ppPaddingPlacement.ppTrailing)
        line = line + drRow.Item("STREETNAME").ToString 

	yPos = topMargin + count * printFont.GetHeight(ev.Graphics)
        ev.Graphics.DrawString(line, printFont, Brushes.Black, leftMargin, yPos, New StringFormat())
        count += 1
    Next

Open in new window

0

Featured Post

Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Microsoft Reports are based on a report definition, which is an XML file that describes data and layout for the report, with a different extension. You can create a client-side report definition language (*.rdlc) file with Visual Studio, and build g…
It’s quite interesting for me as I worked with Excel using vb.net for some time. Here are some topics which I know want to share with others whom this might help. First of all if you are working with Excel then you need to Download the Following …
In this video, Percona Solution Engineer Rick Golba discuss how (and why) you implement high availability in a database environment. To discuss how Percona Consulting can help with your design and architecture needs for your database and infrastr…
This lesson discusses how to use a Mainform + Subforms in Microsoft Access to find and enter data for payments on orders. The sample data comes from a custom shop that builds and sells movable storage structures that are delivered to your property. …
Suggested Courses

610 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question