Springen naar inhoud


- - - - -
VS 2012 SOLVED

Rijen Printen Vanuit Datagrid

VS2012 Datagrid Print

  • Log in a.u.b. om te beantwoorden
Er zijn 10 reacties in dit onderwerp

#1 rob luttge

rob luttge

    Senior Developer

  • Leden
  • PipPipPip
  • 164 berichten
    Laatst bezocht 15 okt 2014 10:51

Geplaatst op 07 januari 2013 - 15:24

Goedemiddag allemaal,

Ik probeer de door Benno aangereikte code aan te passen. Ipv het money format wil ik graag een de datum meegegeven. Ik heb verschillende zaken geprobeerd ( bv  Const _DateFormat As String = "{0:dd/MM/yyyy}" en verschillende dormats die hier op lijken) maar of de applicatie loopt vast of er worden geen rijen geprint (laat staan de data..). De gegevens uit de datagrid komen van een sdf database en de bewuste kolom is datetime gedefinieerd. Inputs en ideeen welkom! Moet er overigens in dit geval nog meer gewijzigd worden dan uitsluitend de definitie van de constante? Groet, Rob


Code:
Public Class GrondstofPrinter
Const _MoneyFormat As String = "{0,12:#,##0.00 €}"
Const _DefaultFormat As String = "{0}"
Private Shared centerFormat As New StringFormat With {.Alignment = StringAlignment.Center}
Private Shared rightFormat As New StringFormat With {.Alignment = StringAlignment.Far}
Private Shared leftFormat As New StringFormat With {.Alignment = StringAlignment.Near}



#2 Benno

Benno

    R.I.P.

  • Leden
  • PipPipPipPipPip
  • 949 berichten
    Laatst bezocht 08 mrt 2018 20:32
  • LocatieGyor, Magyarország

Geplaatst op 08 januari 2013 - 09:51

Bericht bekijkenrob luttge, op 07 januari 2013 - 15:24, zei:

Moet er overigens in dit geval nog meer gewijzigd worden dan uitsluitend de definitie van de constante? Groet, Rob

Dat is niet af te leiden uit de getoonde code.
Maar, als ik bij het rechte eind heb, had je een array voor de formaten (1 element per kolom).
Visual Basic Code:
Private _DataFormats() As String = {_DefaultFormat, _DefaultFormat, _MoneyFormat}

Dat ga je ook moeten aanpassen.

Echter: je hebt dat niet meer nodig.
Als je een DataGridView hebt, dan heb je Columns met eigen Formats en Headers en Widths.
En Fonts en Brushes (via de Styles)
Je kan toch beter die dan gebruiken?

#3 rob luttge

rob luttge

    Senior Developer

  • Leden
  • PipPipPip
  • 164 berichten
    Laatst bezocht 15 okt 2014 10:51

Geplaatst op 09 januari 2013 - 14:09

Benno, Ik vrees dat ik je kwijt ben. Ik heb je (hieronder staande) code een klein beetje aangepast om de datum van productie in de derde kolom te krijgen. (Const _DateFormat As String = "{0:dd/MM/yyyy}" en     Private _ColumnHeaders() As String = {"Type", "Aantal geproduceerd", "Datum productie"} en    Private _DataFormats() As String = {_DefaultFormat, _DefaultFormat, _DateFormat}). Probleem is dat nieuwe rijen nu helemaal niet meer geprint worden. Tot mijn schande moet ik bekennen dat ik geen clou heb hoe ik je advies hierboven in deze code moet / kan toepassen. Zou je een beetje verder kunnen helpen? Dank. Rob



Code:
	Private Sub Btn_Productie_Click(sender As Object, e As EventArgs) Handles Btn_Productie.Click
		Dim oPS As New System.Drawing.Printing.PrinterSettings
		Dim DefaultPrinterName As String = ""
		Try
			DefaultPrinterName = oPS.PrinterName
		Catch ex As System.Exception
			DefaultPrinterName = ""
		Finally
			oPS = Nothing
		End Try
		Dim tablePatroon = laadVerbruik()
		Dim p As New ProductiePrinter("Productie", DefaultPrinterName, tableVoorraad.Select())
		p.Print()
	End Sub

	Private Function laadProductie() As DataTable
		Const query As String = "SELECT Type, Aantal, ProductieDatum FROM Productie"
		Dim result As New DataTable("Productie")
		Using connection As New SqlCeConnection(My.Settings.CS_Productie)
			Using adapter As New SqlCeDataAdapter(query, connection)
				adapter.Fill(result)
			End Using
		End Using
		Return result
	End Function


Code:
Option Strict On
Option Explicit On
Option Infer On
Imports System.Drawing.Printing
Imports System.Drawing
Public Class ProductiePrinter
	Implements IDisposable
	Const _DateFormat As String = "{0:dd/MM/yyyy}"
	Const _DefaultFormat As String = "{0}"
	Private Shared centerFormat As New StringFormat With {.Alignment = StringAlignment.Center}
	Private Shared rightFormat As New StringFormat With {.Alignment = StringAlignment.Near}
	Private Shared leftFormat As New StringFormat With {.Alignment = StringAlignment.Near}
	Private _Rows() As DataRow
	Private _ColumnHeaders() As String = {"Type", "Aantal geproduceerd", "Datum productie"}
	Private _ColumnWidths() As Int32 = {300, 200, 200}
	Private _Alignments() As StringFormat = {centerFormat, leftFormat, rightFormat}
	Private _DataFormats() As String = {_DefaultFormat, _DefaultFormat, _DateFormat}
	Private _PrintDocument As PrintDocument
	Private _Brush As Brush = Brushes.Navy
	Private _HeaderBrush As Brush = Brushes.LightSteelBlue
	Private _ItemBrush As Brush = Brushes.BlanchedAlmond
	Private _AlternateBrush As Brush = Brushes.BurlyWood
	Private _GridPen As Pen = Pens.Gray
	Private _Font As Font = New Font("Consolas", 10)
	Private _TitelFont As Font = New Font(_Font.FontFamily, 18)
	Private _RowIndex As Int32
	Private _Page As Int32
	Public Sub New(titel As String, printerNaam As String, rows() As DataRow)
		Try
			_PrintDocument = New PrintDocument
			_Printdocument.PrinterSettings.PrinterName = printerNaam
			_Printdocument.DefaultPageSettings.Landscape = False
			_Printdocument.DocumentName = titel
			_Rows = rows
			Dim table = rows(0).Table
			AddHandler _Printdocument.PrintPage, AddressOf PrintPage
		Catch ex As Exception
			MsgBox("Tabel 'Productie' is leeg, er valt niets te printen." & vbNewLine & ex.Message)
		End Try
	   
	End Sub
	Public Sub Print()
		_Page = 0
		_RowIndex = 0
		_Printdocument.Print()
	End Sub

	Private Sub PrintPage(sender As Object, e As System.Drawing.Printing.PrintPageEventArgs)
		Dim padding As Int32 = 2
		Dim titelHoogte = _TitelFont.GetHeight(e.Graphics) + padding
		Dim itemHoogte As Single = _Font.GetHeight(e.Graphics) + padding * 2
		Dim itemRect As RectangleF = e.MarginBounds
		Dim currentY As Single = e.MarginBounds.Top
		Dim rowBrushes = {_ItemBrush, _AlternateBrush}
		itemRect.Height = titelHoogte
		e.Graphics.DrawString(_Printdocument.DocumentName, _TitelFont, _Brush, itemRect, centerFormat)
		itemRect.Y += titelHoogte * 2
		itemRect.Height = itemHoogte
		For index = 0 To _ColumnHeaders.Length - 1
			itemRect.Width = _ColumnWidths(index)
			e.Graphics.FillRectangle(_HeaderBrush, itemRect.Left, itemRect.Top, itemRect.Width, itemRect.Height)
			e.Graphics.DrawRectangle(_GridPen, itemRect.Left, itemRect.Top, itemRect.Width, itemRect.Height)
			Dim textRect = itemRect
			textRect.Inflate(-padding, -padding)
			e.Graphics.DrawString(_ColumnHeaders(index), _Font, _Brush, textRect, centerFormat)
			itemRect.Offset(_ColumnWidths(index), 0)
		Next
		itemRect.Offset(0, itemHoogte)
		While _RowIndex < _Rows.Count AndAlso itemRect.Bottom + itemHoogte < e.MarginBounds.Bottom
			itemRect.X = e.MarginBounds.Left
			For index = 0 To _ColumnHeaders.Length - 1
				Dim rowBrush = rowBrushes(_RowIndex Mod 2)
				itemRect.Width = _ColumnWidths(index)
				e.Graphics.FillRectangle(rowBrush, itemRect.Left, itemRect.Top, itemRect.Width, itemRect.Height)
				e.Graphics.DrawRectangle(_GridPen, itemRect.Left, itemRect.Top, itemRect.Width, itemRect.Height)
				Dim textRect = itemRect
				textRect.Inflate(-padding, -padding)
				Dim item As String = String.Format(_DataFormats(index), _Rows(_RowIndex)(index))
				e.Graphics.DrawString(item, _Font, _Brush, textRect, _Alignments(index))
				itemRect.Offset(_ColumnWidths(index), 0)
			Next
			_RowIndex += 1
			itemRect.Offset(0, itemHoogte)
		End While
		e.HasMorePages = _RowIndex < _Rows.Count
	End Sub
#Region "IDisposable Support"
	Private disposedValue As Boolean ' To detect redundant calls
	Protected Overridable Sub Dispose(disposing As Boolean)
		If Not Me.disposedValue Then 
			If disposing Then
				_Printdocument.Dispose()
				_Font.Dispose()
				_TitelFont.Dispose()
			End If
		End If
		Me.disposedValue = True
	End Sub

	Public Sub Dispose() Implements IDisposable.Dispose
		' Do not change this code.  Put cleanup code in Dispose(disposing As Boolean) above.
		Dispose(True)
		GC.SuppressFinalize(Me)
	End Sub
#End Region
End Class



#4 Benno

Benno

    R.I.P.

  • Leden
  • PipPipPipPipPip
  • 949 berichten
    Laatst bezocht 08 mrt 2018 20:32
  • LocatieGyor, Magyarország

Geplaatst op 09 januari 2013 - 16:46

Kan je dat project eens uploaden (of toch minstens het relevante deel)?

Terzijde: ik twijfel aan de zin en de afhandeling van de try..catch in je constructor.
Waarom staat dat daar?

Ik kan een aangepaste klasse maken om je op weg te zetten (zal niet voor vrijdag zijn, want we hebben hier enkele roll-out deadlines die akelig dichtbij komen).
Waarbij de column headers, de  widths  en de formats uit de DataGridView gehaald worden  maar ook de Styles van de cells / headers, rowheaders,  alternate rows, enz...
Ik heb dat eigenlijk al (min of meer) gemaakt enkele dagen terug (styles gedeeltelijk), maar is nog niet echt geschikt om los te laten (ook al betreft het slechts een opzet).
Het is dat probeersel waar ik de styles ga uitslopen (anders is het te veel werk).

#5 Benno

Benno

    R.I.P.

  • Leden
  • PipPipPipPipPip
  • 949 berichten
    Laatst bezocht 08 mrt 2018 20:32
  • LocatieGyor, Magyarország

Geplaatst op 11 januari 2013 - 15:36

Hoi, nu geen tijd om daar echt naar te kijken, dus de klasse zoals ze is, in bijlage.
Format, alignment  en breedte worden uit datagridview gehaald.

Gebruik als volgt:
Visual Basic Code:
Using printer As New DataGridViewPrinter(MijnDataGridView)
	 ' default instellingen: je kan die dus hier wijzigen (bedoeling was die ook uit de styles van de DataGridView te halen).
	 'printer.GridColor = Color.LightGray
	 'printer.AlternateBackColor = Color.BurlyWood
	 'printer.AlternateForeColor = Color.Navy
	 'printer.CellForeColor = Color.Navy
	 'printer.CellBackColor = Color.Bisque
	 'printer.HeaderBackColor = Color.LightSteelBlue
	 'printer.HeaderForeColor = Color.Navy
	 'printer.TitleForeColor = Color.Navy
	 'printer.TitleFontSize = MijnDataGridView.Font.Size * 1.5F
	 printer.Printdocument.DocumentName = "Ceci n'est pas une pipe"
	 printer.Printdocument.DefaultPageSettings.Landscape = False
	 printer.Printdocument.PrinterSettings.PrinterName = "PDFCreator"
	 printer.Print()
End Using

Bijgevoegde Bestanden



#6 rob luttge

rob luttge

    Senior Developer

  • Leden
  • PipPipPip
  • 164 berichten
    Laatst bezocht 15 okt 2014 10:51

Geplaatst op 12 januari 2013 - 08:25

Benno

Ontzettend bedankt, eindelijk werkt eea naar behoren. Waardeer het bijzonder dat je me ondanks je drukke werkzaamheden weer enorm hebt geholpen. Mocht je binnenkort weer wat meer tijd hebben dan ben ik zeer geinteresseerd in de mogelijkheden om de styles van de dgv te gebruiken zoals je in je comment regels aangaf. Zo begrijp ik nog niet hoe je nu een aantal kolommen kunt uitsluiten van de print. Nogmaals dank en prettig weekend toegewenst!

Rob

#7 Benno

Benno

    R.I.P.

  • Leden
  • PipPipPipPipPip
  • 949 berichten
    Laatst bezocht 08 mrt 2018 20:32
  • LocatieGyor, Magyarország

Geplaatst op 16 januari 2013 - 00:23

Bericht bekijkenrob luttge, op 12 januari 2013 - 08:25, zei:

Zo begrijp ik nog niet hoe je nu een aantal kolommen kunt uitsluiten van de print.
Bijvoorbeeld:
1) Maak die Columns Visible=False in je DataGridView en pas de code van de klasse aan om die columns niet af te drukken.
2) Voorzie een property ColumnsToSkip of ColumnsToPrint in de klasse die de Columns respectievelijk net niet of net wel zal afdrukken.

#8 Benno

Benno

    R.I.P.

  • Leden
  • PipPipPipPipPip
  • 949 berichten
    Laatst bezocht 08 mrt 2018 20:32
  • LocatieGyor, Magyarország

Geplaatst op 16 januari 2013 - 00:27

Heb snel even de code aangepast voor optie 1.
Zie bijlage.
Bijlage  DataGridViewPrinter.vb.txt   8,1K   13 downloads

#9 rob luttge

rob luttge

    Senior Developer

  • Leden
  • PipPipPip
  • 164 berichten
    Laatst bezocht 15 okt 2014 10:51

Geplaatst op 18 januari 2013 - 12:48

Benno,

Zeer bedankt. Werkt als gebruikelijk perfect! Excuus dat ik wat laat reageer, maar zat een paar dagen in het buitenland.

Groet

Rob

#10 rob luttge

rob luttge

    Senior Developer

  • Leden
  • PipPipPip
  • 164 berichten
    Laatst bezocht 15 okt 2014 10:51

Geplaatst op 18 januari 2013 - 13:06

Benno,,

Ik ga er van uit dat de code 'itemRect.Width = column.Width' de breedte instelt van de kolom die geprint gaat gaat worden. In de opmaak van de datagridview staat:  .'AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells'. Echter, niet alle headertekst wordt afgedrukt als de headertekst wat langer is. Is er een manier de code zodanig aan te passen dat de breedte van de af te drukken kolom wordt ingesteld op de breedte van het langste veld resp headertekst?

Groet

Rob

Code:
  Private Sub PrintHeader(g As Graphics, padding As Int32, ByRef itemRect As RectangleF, index As Integer)
		Dim column = View.Columns(index)
		itemRect.Width = column.Width
		g.FillRectangle(GetCachedBrush(HeaderBackColor), itemRect.Left, itemRect.Top, itemRect.Width, itemRect.Height)
		g.DrawRectangle(GetCachedPen(GridColor), itemRect.Left, itemRect.Top, itemRect.Width, itemRect.Height)
		Dim textRect = itemRect
		textRect.Inflate(-padding, -padding)
		Dim format = New StringFormat
		format.Alignment = ColumnToStringAlignment(column.HeaderCell.Style.Alignment, View.ColumnHeadersDefaultCellStyle.Alignment)
		g.DrawString(column.HeaderText, View.Font, GetCachedBrush(HeaderForeColor), textRect, format)
		itemRect.Offset(column.Width, 0)
	End Sub



#11 Benno

Benno

    R.I.P.

  • Leden
  • PipPipPipPipPip
  • 949 berichten
    Laatst bezocht 08 mrt 2018 20:32
  • LocatieGyor, Magyarország

Geplaatst op 18 januari 2013 - 18:58

Ik kan dat niet reproduceren.
Het is ook niet logisch: de width van de column @runtime is de breedte die nodig is.
Dus normaliter zou dat goed moeten printen

Wat het wel kan zijn: ik neem een vast aantal pixels voor padding. Dat zou teveel kunnen zijn.
Pas dat eens aan en kijk of dat het probleem oplost





Ook met taq VS 2012 SOLVED, VS2012, Datagrid, Print voorzien

0 gebruiker(s) lezen dit onderwerp

0 lid(leden), 0 bezoeker(s), 0 anonieme gebruikers

Inloggen


[VS 2012 SOLVED] Untitled 1

Met dank aan Jürgen voor de jarenlange inzet van visualbasic.be (anno dec 2000)
Met dank aan Mike en Ronneke voor de jarenlange inzet van vbib.be (anno dec 2010)
Met dank aan PascalBianca voor de jarenlange inzet van vbib.be (anno dec 2016)